在C++中键入宏
Type macros in C++
本文关键字:C++ 更新时间:2023-10-16
#define int double
#define double int
int a = 5.5;
double f = 5.5;
cout << a << " " << f << endl;
下面的代码片段实际上输出 5 5.5,这意味着 int 实际上意味着 int,而 double 实际上意味着 double。
我想知道这有什么意义? 我可以相信 int 和双重含义 int,如果定义一个接一个地执行,或者其中两个改变它们的含义(如果它们两个同时执行),但我找不到这种行为的正确解释。
为什么会这样?
当预处理器替换宏时,一旦准备好宏替换列表,就会重新扫描它以获得更多宏替换机会。但是,此过程不允许递归替换。
在您的情况下
int a = 5.5;
int
被视为宏名称。它的替换列表是double
.将重新扫描此替换以获取更多宏。找到宏名称double
并将其替换为int
。再次重新扫描此结果以获取更多宏。再次找到宏名称int
,但这次它不会被替换,因为"无递归"规则阻止了这一点。此时,重新扫描过程停止。您的原始int
将宏替换为int
。因此,实际上什么都没有改变。
同样的事情发生在double
.以同样的方式,double
最终被double
所取代。
这基本上与允许我们定义与现有函数名称匹配的宏名称的功能相同。
即#define fgets fgets
这不会导致无限递归替换,当我们这样做时
fgets(buffer, sizeof buffer, stdin);
宏仅替换一次。
相关文章:
- 没有找到相关文章