OMG*_*chy 13 c c++ typedef c-preprocessor
在浏览一些大量混合C和C++的源代码时,我遇到了以下内容(稍加修改以保护公司的工作,其含义保持不变):
/*
* Typedefs of void are synonymous with the void keyword in C,
* but not in C++. In order to support the use of MY_VOID
* in place of the void keyword to specify that a function takes no
* arguments, it must be a macro rather than a typedef.
*/
#define MY_VOID void
Run Code Online (Sandbox Code Playgroud)
之间有什么区别typedef void MY_VOID
,并#define MY_VOID void
在此特定背景?
我不相信这是这个问题的重复,因为它特别询问了关于功能签名的含义,而不是更为一般的"有什么区别".
C++中的简单测试程序演示了不同之处:
typedef void VOID;
void f(VOID) {}
int main()
{
f();
}
Run Code Online (Sandbox Code Playgroud)
在编译(作为C++)时,它会给出以下错误:
prog.cpp:5:8: error: '<anonymous>' has incomplete type
void f(VOID) {}
^
prog.cpp:5:12: error: invalid use of 'VOID {aka void}'
void f(VOID) {}
^
prog.cpp: In function 'int main()':
prog.cpp:9:7: error: too few arguments to function 'void f(<type error>)'
f();
^
prog.cpp:5:6: note: declared here
void f(VOID) {}
^
Run Code Online (Sandbox Code Playgroud)
这解释了评论在您的代码中的含义.特别地,似乎的typedef VOID
尝试是一种类型的不同从void
,当它被用作参数类型.
评论解释了差异.给定别名void
:
typedef void MY_VOID;
Run Code Online (Sandbox Code Playgroud)
如果您尝试使用它而不是void
指示函数不带参数:
int f(MY_VOID);
Run Code Online (Sandbox Code Playgroud)
C将允许这样,但C++不会.
所以,如果你真的想通过编写(a)在两种语言中都有效的代码和(b)使用别名来实现这种特殊用途void
,那么这个别名必须是一个宏.