怎么“sizeof(char [0])”与GCC编译得很好

时间:2015-06-01 05:58:39

标签: c gcc

我的一位同事在多行的末尾添加了(void) sizeof (char[0]),宏显示为do {...} while (0)的替代。我环顾四周,但找不到任何参考资料,甚至编译它也让我感到惊讶。

有效C吗?我很想参考std。

2 个答案:

答案 0 :(得分:6)

如果您使用gcc -pedantic进行编译,则会收到一条警告消息:

warning: ISO C forbids zero-size array [-Wpedantic]

C标准的最新草案N1570,第6.7.6.2节(阵列声明者)第1段说:

  

如果表达式是常量表达式,则它应具有值   大于零。

这是约束的一部分,因此char[0]是一个约束违规,需要来自任何符合标准的C编译器的诊断。

(在没有声明的对象的情况下,该特定子句适用于类型名称char[0]并非100%明确,但一般的想法是标准C不支持零长度数组。)

gcc支持将零大小的数组作为扩展名documented here

答案 1 :(得分:2)

C11 6.5.3.4/2:

  

sizeof运算符产生其操作数的大小(以字节为单位),可以是   表达式或类型的带括号的名称

/ 4:

  

当应用于具有数组类型的操作数时,结果是数组中的总字节数。

C11 6.7.7定义类型名称,尤其是/ 2:

  

在几种情况下,有必要指定一种类型。这是使用类型名称完成的,类型名称是语法函数的声明或省略标识符的该类型的对象。

所以char[0]是一个类型名称,因为它在语法上是一个省略标识符的对象的声明。 (从语义上讲,它是无效的,因为不允许使用零大小的数组,但它仍然是类型名称)。

基于这些引用,我会说sizeof未明确。 6.5.3.4/2不限制类型名称键入名称,如果包含标识符,则该名称将成为合法声明。 6.5.3.4/4确实说“数组”,但是nobody can agree on what "array" means in C anyway我不认为这显然暗示char[0]

基于这些引用,我会说这是不确定的。