Вла*_*вић -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,如果定义是一个接一个地执行,或者其中两个改变它们的含义(如果它们都同时执行),但我找不到对这种行为的正确解释.
为什么会这样?
当预处理器替换宏时,一旦准备好宏替换列表,就会重新扫描它以获得更多的宏替换机会.但是,此过程不允许递归替换.
在你的情况下
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)
宏只替换一次.