【发布时间】:2019-04-12 03:04:18
【问题描述】:
我遇到了以下宏,我无法理解它到底在做什么;
#include <iostream>
#define TEST(a1) \
int a1 = 5;
int main(){
TEST(a1);
std::cout << a1 << std::endl;
return 0;
}
它编译并打印5。
我在一定程度上了解宏,但我无法理解这里发生的事情。对我来说TEST 看起来像是一个正在重新定义其参数a1 的函数?
【问题讨论】:
-
在 C 和 C++ 中,宏的行为就像一个愚蠢的复制“n”粘贴(除非您执行诸如字符串化或令牌连接之类的操作)。当您“调用”宏时传递的令牌只是作为宏扩展的一部分粘贴到语句
int a1 = 5;中。如果你使用 GCC 或 Clang,你可以试试running just the preprocessor and looking at the output to see what's happening。 -
@Cornstalks 啊抱歉我已经删除了那部分,这是我这边的一个错误。但我仍然不明白发生了什么。这里复制了什么?最终结果是什么
-
-E选项将使 gcc/clang 仅运行预处理器,并将发出最终处理的代码(在编译之前)。我建议使用 gcc.godbolt.org 作为探索宏及其扩展内容的简单方法(但请注意:如果您#include是一个文件,那么您正在享受一种享受 :))。