以错误的方式使用#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
是一个预处理器宏。预处理器在编译器之前运行,因此 - 编译器甚至看不到任何 #define
s,所以它不能聪明(或不聪明)这些。
这能回答你的问题吗? 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”?