以错误的方式使用#define 来调用函数。为啥? [关闭]

Posted

技术标签:

【中文标题】以错误的方式使用#define 来调用函数。为啥? [关闭]【英文标题】:Using #define the wrong way round works for calling functions. Why? [closed]以错误的方式使用#define 来调用函数。为什么? [关闭] 【发布时间】:2021-06-04 11:06:25 【问题描述】:

使用 #define 的 C 和 C++ 文档表明这不应该起作用,因为我使用定义将文本 MyFunc() 替换为 _myfunc() ,这是一个不存在的函数:

#define MyFunc _myfunc

void MyFunc()

    cout << "This Prints!" << endl;


int Main()

    _myfunc();
    return 0;

我的猜测是编译器很聪明。它知道 _myfunc() 不存在,因此不替换文本,简单地使用 MyFunc()。

我找不到任何文档来支持这一理论。有谁知道这是否正确?

【问题讨论】:

#define 是一个预处理器宏。预处理器在编译器之前运行,因此 - 编译器甚至看不到任何 #defines,所以它不能聪明(或不聪明)这些。 这能回答你的问题吗? How do I see a C/C++ source file after preprocessing in Visual Studio? 您的猜测不正确。 void MyFunc()void _myfunc() 取代,因为这就是 #define 的工作方式,当 main 被编译时不会发生任何令人兴奋的事情。 【参考方案1】:

预处理器运行后,您的程序将如下所示:

void _myfunc()

    cout << "This Prints!" << endl;


int Main()

    _myfunc();  // #1
    return 0;

这里忽略其他错误(缺少包含,...),编译器可以找到声明和定义的_myfunc,所以自然会在调用站点#1处通过重载解析找到。

【讨论】:

以上是关于以错误的方式使用#define 来调用函数。为啥? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

构建一个 JavaScript 库,为啥要以这种方式使用 IIFE?

为啥这个递归函数超过调用堆栈大小?

为啥会出现这个错误:Gulp 中的“require is not defined”?

为啥函数调用在 swiftui 中返回不可变值时出现错误?

为啥我在 Laravel 中收到“Route [/login] not defined 错误”?

为啥箭头函数没有参数数组? [复制]