我在一个文件 displaynumber.h 中定义了一个枚举:
class CDisplayNumber : public CStatic
{
DECLARE_DYNAMIC(CDisplayNumber)
public:
CDisplayNumber();
virtual ~CDisplayNumber();
enum NUMBER_COLOR
{
BLACK,
GREEN,
RED,
YELLOW
};
......
};
在编译时总是提示:
1>d:/works/meet/commcontrol/displaynumber.h(18) : error C2143: syntax error : missing '}' before '('
1>d:/works/meet/commcontrol/displaynumber.h(22) : error C2143: syntax error : missing ';' before '}'
1>d:/works/meet/commcontrol/displaynumber.h(22) : error C2238: unexpected token(s) preceding ';'
1>d:/works/meet/commcontrol/displaynumber.h(24) : error C2065: 'NUMBER_COLOR' : undeclared identifier
经过查找,另一个文件 graph.h 中定义了:
#define RED RGB(255,0,0)
#define GREEN RGB(0,255,0)
#define BLUE RGB(0,0,255)
#define YELLOW RGB(255,255,0)
#define ORANGE RGB(255,153,51)
#define HOT_PINK RGB(255,51,153)
#define PURPLE RGB(153,0,204)
#define CYAN RGB(0,255,255)
#define BLACK RGB(0,0,0)
且一个cpp文件隐式包含:
#include "graph.h"
#include "displaynumber.h"
把这个包含关系互换,编译就不再出错。
总结:
这里因为编译在编译的时候,先遇到宏定义#define BLACK RGB(0,0,0) ,然后继续编译遇到枚举类型中的 BLACK ,它直接把BLACK 替换成了RGB(0,0,0)所以成了
enum NUMBER_COLOR
{
RGB(0,0,0),
GREEN,
RED,
YELLOW
};
这样,编译器就发出了错误警告。
幸运的是这个编译器发现了错误。
假如,宏 BLACK 定义成一个字符,例如:、
#define BLACK b
则编译器不会发出错误,继续编译成功,但实际上,NUMBER_COLOR中的常量BLACK,就隐式的改成了 b。这样就为程序埋下了隐患。而这个隐患一但发生,是很难查找的错误。