typedef void FOO与#define FOO的含义在函数签名中无效

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在此特定背景?


我不相信这是这个问题的重复,因为它特别询问了关于功能签名的含义,而不是更为一般的"有什么区别".

Naw*_*waz 8

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,当它被用作参数类型.

  • @ Mints97"*当它用作参数类型*"时. (2认同)
  • 嗯,确切地说.我想知道标准中的差异在哪里. (2认同)

Mik*_*our 5

评论解释了差异.给定别名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,那么这个别名必须是一个宏.