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

 

我在一个文件 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。这样就为程序埋下了隐患。而这个隐患一但发生,是很难查找的错误。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值