`void foo(int a[static 0]);`有效吗?

问题描述 投票:0回答:2

以下函数是否严格符合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);
c language-lawyer c99
2个回答
0
投票

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 也是约束违规。


0
投票

这是不合规的,因为数组的大小不能为 0。因此也不是“至少 0”。

C17 6.7.6.2 强调我的:

限制

除了可选类型限定符和关键字

static
之外,[ 和 ] 还可以分隔 表达式或 *.如果它们分隔表达式(指定数组的大小),则 表达式应具有整数类型。 如果表达式是常量表达式,则应 值大于零。

(在 C99 中,在 6.7.5.2 下面找到相同的文本)

© www.soinside.com 2019 - 2024. All rights reserved.