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 eWidth 和const 没有任何这样的事情发生Width.
请在此处查看错误:http://www.ideone.com/naZ3P
此外,阅读Item 2 : Prefer consts, enums, and inlines to #defines来自有效的C++斯科特迈尔斯.
#define 值被预处理器替换为它们被声明为的值,所以在调试器中,它只看到值,而不是#defined名称,例如,如果你有#define NUMBER_OF_CATS 10,在调试器中你只能看到10(因为预处理器已将代码中的每个NUMBER_OF_CATS实例替换为10.
枚举类型本身就是一个类型,值是此类型的常量实例,因此预处理器将其单独保留,您将在调试器中看到该值的符号描述.