首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >void、VOID、C和C++

void、VOID、C和C++
EN

Stack Overflow用户
提问于 2009-02-12 10:31:25
回答 2查看 3.9K关注 0票数 12

我有以下代码:

代码语言:javascript
复制
typedef void VOID;
int f(void);
int g(VOID);

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

代码语言:javascript
复制
void.c:3: error: ‘<anonymous>’ has incomplete type
void.c:3: error: invalid use of ‘VOID’

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-02-12 11:06:55

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

从C99草案中,TC2 (6.7.5.3/10):

将类型为

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

它显式地讨论了"void“类型,而不是关键字。

来自C++标准的8.3.5/2

如果参数声明子句为空,则函数不接受任何参数。参数列表(void)等同于空的参数列表。

在模板参数推导失败(14.8.2/2)的情况下,也可以看出实际的关键字是"void",而不是一般类型"void“:

  • 正在尝试创建参数类型为空的函数类型。

这是由其他人明确的,值得注意的是,在一个核心语言问题报告here和一些由其他答案链接的GCC报告中。

综上所述,你的GCC是对的,但之前的GCC版本是错的。因此,该代码可能早些时候已经用它成功编译过了。你应该修正你的代码,这样它对两个函数都使用"void“,然后它也可以用其他编译器编译(comeau也用这个”VOID“拒绝第二个声明)。

票数 17
EN

Stack Overflow用户

发布于 2009-02-12 10:41:24

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/540748

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档