为什么 C 预处理器认为枚举值是相等的?

新手上路,请多包涵

为什么即使 AB 不同,以下代码中的 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 许可协议

阅读 777
2 个回答

There are no macros called A or B , so on your #if line, A and B get replaced通过 0 ,所以你实际上有:

 enum T { A = 1, B = 2 };

int main() {
#if (0 == 0)
    std::cout << A << B;
#endif
}

预处理器在编译器了解您的任何信息之前运行 enum 。预处理器只知道宏( #define )。

原文由 Simple 发布,翻译遵循 CC BY-SA 3.0 许可协议

这是因为预处理器在编译时间之前工作。

由于枚举定义发生在编译时,A 和 B 都将被定义为空(pp-number 0 ) - 因此在预处理时相等,因此输出语句包含在编译的代码。

当您使用 #define 它们在预处理时定义不同,因此语句评估为假。

关于您对您想要做什么的评论,您不需要使用预处理器 #if 来执行此操作。 You can just use the standard if as both MODE and MODE_GREY (or MODE_RGB or MODE_CMYK ) are all仍然定义:

 #include <iostream>

enum T { MODE_RGB = 1, MODE_GREY = 2, MODE_CMYK = 3 };

#define MODE MODE_GREY

int main()
{
    if( MODE == MODE_GREY )
        std::cout << "Grey mode" << std::endl;
    else if( MODE == MODE_RGB )
        std::cout << "RGB mode" << std::endl;
    else if( MODE == MODE_CMYK )
        std::cout << "CMYK mode" << std::endl;

    return 0;
}

仅使用预处理器的另一个选项是按照下面 正确回答 的@TripeHound 执行此操作。

原文由 Samidamaru 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题