以下函数是否严格符合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 告诉
关键字表示指针 a 应该指向至少零个元素,…static
6.7.6.3 7 并不是唯一适用的规则。
如您所知,声明为数组的参数会自动调整为指针。但在调整之前,它是一个声明为数组的参数。数组声明符的规则之一是 6.7.6.2 1:
中的约束除了可选类型限定符和关键字 static 之外,
和[
还可以分隔表达式或]
。如果它们分隔表达式(指定数组的大小),则该表达式应具有整数类型。如果表达式是常量表达式,则其值应大于零...*
即使满足 6.7.6.3 7,违反 6.7.6.2 1 也是约束违规。
这是不合规的,因为数组的大小不能为 0。因此也不是“至少 0”。
C17 6.7.6.2 强调我的:
限制
除了可选类型限定符和关键字
之外,[ 和 ] 还可以分隔 表达式或 *.如果它们分隔表达式(指定数组的大小),则 表达式应具有整数类型。 如果表达式是常量表达式,则应 值大于零。static
(在 C99 中,在 6.7.5.2 下面找到相同的文本)