void,VOID,C和C++

Tom*_*mek 12 c c++ standards

我有以下代码:

typedef void VOID;
int f(void);
int g(VOID);
Run Code Online (Sandbox Code Playgroud)

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

void.c:3: error: ‘<anonymous>’ has incomplete type
void.c:3: error: invalid use of ‘VOID’
Run Code Online (Sandbox Code Playgroud)

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

cod*_*gic 17

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

  • "gcc bugs"不是答案配偶 (3认同)

Joh*_*itb 17

是的,据我所知,第二个声明在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 bug报告.


总结一下,你的海湾合作委员会是正确的,但早期的GCC版本是错误的.因此,该代码可能已经使用它成功编译.您应该解决您的代码,以便它使用"作废"两种功能,那么它也将编译和其它编译器(科莫还拒绝与"VOID"第二个声明).

  • 这是否意味着它在C++ 11中有效? (3认同)