C++ - enum vs. const vs. #define

Sim*_*ity 28 c++ macros enumeration constants

在这篇文章的最后:http://www.learncpp.com/cpp-tutorial/45-enumerated-types/,它提到了以下内容:

最后,与常量变量一样,枚举类型显示在调试器中,使得它们在这方面比#defined值更有用.

上面的大胆句子是如何实现的?

谢谢.

Naw*_*waz 30

考虑一下这段代码

#define WIDTH 300

enum econst
{
   eWidth=300
};

const int Width=300;

struct sample{};

int main() 
{
        sample s;
        int x = eWidth * s; //error 1
        int y = WIDTH * s;  //error 2
        int z = Width * s;  //error 3
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

显然,每次乘法都会导致编译错误,但是看看GCC如何为每个乘法错误生成消息:

prog.cpp:19:错误:"eWidth*s"
中的'operator*'不匹配prog.cpp:20:错误:"300*s"
prog.cpp 中的'operator*'不匹配:21:错误: "宽度*s"中的"运算符*"不匹配

在错误消息中,您没有看到WIDTH您的宏#defined,对吧?这是因为当GCC使得任何编译线的尝试都对应于第二个错误时,它看不到WIDTH,它只看到300,就像GCC编译线之前一样,预处理器已经WIDTH用300 替换.另一方面,enum eWidthconst 没有任何这样的事情发生Width.

请在此处查看错误:http://www.ideone.com/naZ3P


此外,阅读Item 2 : Prefer consts, enums, and inlines to #defines来自有效的C++斯科特迈尔斯.


小智 14

enum 是编译时间常量,调试信息没有存储分配.

const 分配有存储,具体取决于编译器是否通过常量传播进行优化.

#define 没有存储分配.

  • 最简洁的答案. (2认同)

Jac*_*ope 6

#define 值被预处理器替换为它们被声明为的值,所以在调试器中,它只看到值,而不是#defined名称,例如,如果你有#define NUMBER_OF_CATS 10,在调试器中你只能看到10(因为预处理器已将代码中的每个NUMBER_OF_CATS实例替换为10.

枚举类型本身就是一个类型,值是此类型的常量实例,因此预处理器将其单独保留,您将在调试器中看到该值的符号描述.