您的位置:首页 > 其它

宏定义与枚举定义冲突错误

2010-08-11 16:12 78 查看
我在一个文件 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。这样就为程序埋下了隐患。而这个隐患一但发生,是很难查找的错误。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: