12

我有以下代码:

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 不起作用。

4

3 回答 3

17

gcc 错误。编辑:由于不够清楚,我的意思是 gcc 4.3.2 由于错误而正在编译它。请参阅#32364#9278

于 2009-02-12T10:45:03.623 回答
17

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

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

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

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

来自 C++ 标准,8.3.5/2

如果 parameter-declaration-clause 为空,则该函数不接受任何参数。参数列表(void)相当于空参数列表。

从模板参数推导失败的一种情况14.8.2/2

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

其他人已经清楚地说明了这一点,在此处的一个核心语言问题报告和其他答案链接的一些 GCC 错误报告中值得注意。


回顾一下,您的 GCC 是正确的,但早期的 GCC 版本是错误的。因此,该代码可能已在较早时成功编译。您应该修复您的代码,以便它对两个函数都使用“void”,然后它也将与其他编译器一起编译(comeau 也拒绝使用该“VOID”的第二个声明)。

于 2009-02-12T11:06:55.490 回答
0

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

于 2009-02-12T10:41:24.007 回答