在C标准中至少有两个地方禁止定义类型不完整的对象(http://eel.is/c草稿/基本。定义5,http://eel.is/c草稿/基本。类型#5)。但是,在C中,通常允许为不完整类型的对象提供非定义声明。而且我似乎无法指出禁止以那种方式声明void
类型的不完整“对象”的具体部分。(例如,void
不是C中的对象类型,但引用类型也不是。)那么,这是吗
extern void a;
C语言格式真的很糟糕?
在C代码中,允许为void
对象(如上所示)提供非定义声明,GCC和Clang都接受上述C代码(当然,不允许定义)。但在C代码中,这两个编译器都会为此类声明发出错误。标准的哪一部分要求他们这样做?
[basic.fundamental]
列出了space
类型(http://eel.is/c草稿/basic.types#basic.fundamental-13)的可能用法,但它似乎不是一个完整的列表。
我相信有关的段落如下:
[dcl.stc]
5extern
说明符仅适用于变量或函数的声明。
[基本]
6变量是通过声明非静态数据成员或对象以外的引用引入的。变量的名称(如果有)表示引用或对象。
[基本类型]
8对象类型是一种(可能是cv限定的)类型,它不是函数类型,不是引用类型,也不是cv void。
一个
,作为一个变量声明,必须表示一个引用或一个对象,根据[基本]。它涵盖了确实不是对象类型的引用。但是,由于space既不是引用也不是对象类型,因此声明格式不佳。