首页 > 解决方案 > 为什么#define不能被迭代使用?

问题描述

#include <stdio.h>

#define ONE 3 > 2 ? 16 : 64
#define TWO ONE/16

int main () {  
    printf("%d\n", TWO);
    return 0;
}

我写了两个#define,但输出是 16,而我预计它是 1。为什么会发生这种情况?

标签: c++c-preprocessor

解决方案


宏是一种简单的文本替换。当预处理器遍历代码时,它会替换

printf("%d\n", TWO);

printf("%d\n", ONE/16);

然后用

printf("%d\n", 3 > 2 ? 16 : 64/16);

然后编译器可以看到三元运算符条件的计算结果为 true 并采用第一个结果 - 16


您可能希望将第一个宏括在括号中:

#define ONE (3 > 2 ? 16 : 64)

但我强烈建议尽可能避免使用宏。正如评论所暗示的,

constexpr auto ONE = 3 > 2 ? 16 : 64;

会给你预期的结果。


推荐阅读