在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);

宏仅替换一次。

相关文章:
  • 没有找到相关文章