我有以下代码:
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
:
如果参数声明子句为空,则该函数不接受任何参数。参数列表(void)
相当于空参数列表。
从模板参数推导失败的情况之一也可以看出,它意味着带有“void”的实际关键字,而不是一般类型“void”(14.8.2/2
):
其他人已经说得很清楚了,在一份核心语言问题报告中值得注意here http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/cwg_closed.html#18以及其他答案链接到的一些 GCC 错误报告。
回顾一下,您的 GCC 是正确的,但早期的 GCC 版本是错误的。因此,该代码可能之前已成功编译。您应该修复您的代码,以便它对两个函数都使用“void”,然后它也可以与其他编译器一起编译(comeau 也拒绝使用该“VOID”的第二个声明)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)