在C++中键入宏

Вла*_*вић -2 c++ macros double int

     #define int double
     #define double int


     int a = 5.5;
     double f = 5.5;

     cout << a << " " << f << endl;
Run Code Online (Sandbox Code Playgroud)

以下代码片段实际输出5 5.5,意味着int实际上意味着int,而double实际上意味着double.

我想知道这有什么意义?我可以相信int和double意味着int,如果定义是一个接一个地执行,或者其中两个改变它们的含义(如果它们都同时执行),但我找不到对这种行为的正确解释.

为什么会这样?

AnT*_*AnT 8

当预处理器替换宏时,一旦准备好宏替换列表,就会重新扫描它以获得更多的宏替换机会.但是,此过程不允许递归替换.

在你的情况下

int a = 5.5;
Run Code Online (Sandbox Code Playgroud)

int被视为宏名称.它的替换清单是double.重新扫描此替换以获取更多宏.double找到宏名称并替换为int.对于更多宏,将再次重新扫描此结果.int再次找到宏名称,但这次它没有被替换,因为"无递归"规则阻止了这一点.此时重新扫描过程停止.您的原始版本int被宏替换为int.所以,实际上没有任何改变.

同样的事情发生在double.以同样的方式double最终被取代double.


这基本上是允许我们定义与现有函数名称匹配的宏名称的相同功能.即

#define fgets fgets
Run Code Online (Sandbox Code Playgroud)

当我们这样做时,这不会导致无限递归替换

fgets(buffer, sizeof buffer, stdin);
Run Code Online (Sandbox Code Playgroud)

宏只替换一次.