c++ - 无效、无效、C 和 C++

标签 c++ c standards

我有以下代码:

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):

The special case of an unnamed parameter of type void as the only item in the list specifies that the function has no parameters.

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

来自 C++ 标准,8.3.5/2:

If the parameter-declaration-clause is empty, the function takes no arguments. The parameter list (void) is equivalent to the empty parameter list.

从模板参数推导失败的一种情况(14.8.2/2)中也可以看出它是带有“void”的实际关键字,而不是通用类型“void” :

  • Attempting to create a function type in which a parameter has a type of void.

其他人已经说得很清楚了,在一份核心语言问题报告中值得注意here以及由其他答案链接到的一些 GCC 错误报告。


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

关于c++ - 无效、无效、C 和 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/540748/

相关文章:

c# - 如何在 C# 中从 native dll 捕获 c0000005 异常

c# - 如何将二进制文件转换为另一种二进制表示形式,如图像

c++ - 执行 vector 运算

c - 为什么这个字符串不会溢出缓冲区?

c++ - 下溢或上溢的指针会发生什么情况?

c++ - 弃用 static 关键字...不再?

c++ - 制作一个单一的捕获 Lambda

c++ - 调用DrawText时DT_NOFULLWIDTHCHARBREAK有什么作用?

c++ - C 与 C++ 大小

c - 为什么 C 标准不支持嵌套函数?