[英]void, VOID, C and C++
我有以下代码:
typedef void VOID;
int f(void);
int g(VOID);
它在C中编译得很好(在Fedora 10上使用gcc 4.3.2)。 编译为C ++的相同代码给出了以下错误:
void.c:3: error: ‘<anonymous>’ 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”的第二个声明)。
我只是把你的代码放在一个.cpp文件中,它在VS2005,SUSE,Redhat和Solaris中没有问题编译,所以我猜你的具体gcc版本不赞成这个。 加尔
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.