为什么即使 A
和 B
不同,以下代码中的 std::cout
行仍然运行?
#include <iostream>
enum T { A = 1, B = 2 };
// #define A 1
// #define B 2
int main() {
#if (A == B)
std::cout << A << B;
#endif
}
如果我使用 #define
代替(如注释掉的那样),我不会得到预期的输出。
提问的原因:
我想为一些测试代码提供一个模式选择器,在其中我可以通过在顶部注释/取消注释行轻松更改模式:
enum T { MODE_RGB = 1, MODE_GREY = 2, MODE_CMYK = 3 };
// #define MODE MODE_RGB
#define MODE MODE_GREY
// #define MODE MODE_CMYK
int main() {
#if (MODE == MODE_RGB)
// do RGB stuff
#elif (MODE == MODE_GREY)
// do greyscale stuff
#else
// do CMYK stuff
#endif
// some common code
some_function(arg1, arg2,
#if (MODE == MODE_RGB)
// RGB calculation for arg3,
#elif (MODE == MODE_GREY)
// greyscale calculation for arg3,
#else
// CMYK calculation for arg3,
#endif
arg4, arg5);
}
我知道我可以使用数值,例如
#define MODE 1 // RGB
...
#if (MODE == 1) // RGB
但它使代码的可读性降低。
有没有一个优雅的解决方案?
原文由 Gnubie 发布,翻译遵循 CC BY-SA 4.0 许可协议
There are no macros called
A
orB
, so on your#if
line,A
andB
get replaced通过0
,所以你实际上有:预处理器在编译器了解您的任何信息之前运行
enum
。预处理器只知道宏(#define
)。