我的一位同事在多行的末尾添加了(void) sizeof (char[0])
,宏显示为do {...} while (0)
的替代。我环顾四周,但找不到任何参考资料,甚至编译它也让我感到惊讶。
有效C吗?我很想参考std。
答案 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]
。
基于这些引用,我会说这是不确定的。