以下功能是否严格符合C99?
void foo(int a[static 0]) {
(void)a;
}
GCC和Clang都发出了使用零大小数组的警告,但我认为这个警告是没有道理的.AFAIK中,6.7.6.3p7告诉static
关键字指示指针a
应该指向至少零个元素,这一要求对于任何具有确定值的指针来说都是微不足道的.
此外,在以下情况下是否可以调用此类函数:
int i;
foo(NULL);
foo(&i);
foo(&i + 1);
以下功能是否严格符合C99?
void foo(int a[static 0]) {
(void)a;
}
GCC和Clang都发出了使用零大小数组的警告,但我认为这个警告是没有道理的.AFAIK中,6.7.6.3p7告诉static
关键字指示指针a
应该指向至少零个元素,这一要求对于任何具有确定值的指针来说都是微不足道的.
此外,在以下情况下是否可以调用此类函数:
int i;
foo(NULL);
foo(&i);
foo(&i + 1);
AFAIK,6.7.6.3p7告诉
static
关键字指示指针a应该指向至少零个元素…
6.7.6.3 7不是唯一适用的规则.
如您所知,声明为数组的参数会自动调整为指针.但在调整它之前,它是一个声明为数组的参数.数组声明符的规则之一是6.7.6.2 1中的约束:
除了可选的类型限定符和关键字Static之外,
[
和]
还可以分隔表达式或*
.如果它们分隔一个表达式(指定数组的大小),则该表达式应为整数类型.如果表达式是常量表达式,则其值应大于零…
即使满足6.7.6.3 7,违反6.7.6.2 1也是违反约束.
…指向至少零个元素,任何具有确定值的指针都可以很容易地满足这一要求.
不,不是的.首先,空指针不指向至少零个元素,因为它不指向任何元素.
其次,指针不仅需要指向至少零个元素,还需要特别指向至少包含零个元素的数组的第一个元素.任何至少有零个元素的数组都至少有一个元素,因为6.2.5 20将数组类型定义为"连续分配nonempty组具有特定成员对象类型的对象".因此,它是一个数组这一事实本身就意味着它至少有一个元素.
因此,即使声明为int a[static 0]
,a
也必须至少指向一个int
.