void,VOID,C和C ++

我有以下代码:

typedef void VOID; int f(void); int g(VOID); 

它在C中编译得很好(在Fedora 10上使用gcc 4.3.2)。 编译为C ++的相同代码给出了以下错误:

 void.c:3: error: '' has incomplete type void.c:3: error: invalid use of 'VOID' 

现在,这是外部库中的东西,我希望所有者解决这个问题。 所以我有一个问题 – C ++标准是否禁止此构造? 你能给我一个指针/引文吗? 我唯一记得的是在C ++中不推荐用函数声明(void)来表示空参数列表,但我不明白为什么typedefed VOID不起作用。

是的,据我所知,第二个声明在C ++和C89中无效,但它在C99中有效。

来自C99草案,TC2( 6.7.5.3/10 ):

void类型的未命名参数的特殊情况作为列表中唯一的项目指定该函数没有参数。

它明确地谈论类型“void”,而不是关键字。

来自C ++标准, 8.3.5/2

如果parameter-declaration-clause为空,则该函数不带参数。 参数列表(void)等效于空参数列表。

这意味着具有“void”的实际关键字,而不是通用类型“void”也可以从模板参数推断失败的情况( 14.8.2/2 )中看出:

  • 试图创建一个函数类型,其中参数的类型为void。

其他人已经明确表示, 这里有一个核心语言问题报告,其中一些GCC错误报告与其他答案相关联。


总结一下,你的海湾合作委员会是正确的,但早期的GCC版本是错误的。 因此,该代码可能已经使用它成功编译。 您应该修复您的代码,以便它对两个函数使用“void”,然后它也将与其他编译器一起编译(comeau也拒绝使用该“VOID”的第二个声明)。

gcc错误 。 编辑:因为它不够清楚,我的意思是gcc 4.3.2由于错误编译它。 见#32364和#9278 。

我只是把你的代码放在一个.cpp文件中,它在VS2005,SUSE,Redhat和Solaris中没有问题编译,所以我猜你的具体gcc版本不赞成这个。 加尔