c++ - typedef void FOO 与 #define FOO void 在函数签名中的含义

标签 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

typedef void MY_VOID#define MY_VOID void 在这个特定的上下文中有什么区别?


我不相信这是 this question 的拷贝因为它专门询问函数签名的含义,而不是更笼统的“有什么区别”。

最佳答案

一个简单的 C++ 测试程序演示了不同之处:

typedef void VOID;

void f(VOID) {}

int main()
{
    f();
}

在编译时(作为 C++),it gives these error :

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) {}
      ^

它解释了注释在您的代码中的含义。特别是,似乎 typedef VOID 试图成为与 void 不同的类型,当它用作参数类型时 em>。

关于c++ - typedef void FOO 与 #define FOO void 在函数签名中的含义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29896248/

相关文章:

c++ - Direct3D typedef 用法

c++ - 虽然循环不允许我正确解析字符串

c++ - 在另一个中声明一个类成员

c - 如何从 C 中的文本文件中读取字符串矩阵?

c - 用按位运算符替换 "=="

c++ - "typedef"类型名称可以像 "struct"定义那样声明指向结构的指针吗?

c++ - 如何创建一个 ifstream 对象数组以及如何用编号的文本文件填充该数组?

c++ - 了解如何创建 atoi;字符是如何比较的?

c - 如何从 Code::Blocks 的输出窗口中删除与执行相关的文本

c - 定义一个delete(student st[], int *itemcount)函数来从学生对象数组中删除目标记录