宏定义与枚举定义冲突错误
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。这样就为程序埋下了隐患。而这个隐患一但发生,是很难查找的错误。
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。这样就为程序埋下了隐患。而这个隐患一但发生,是很难查找的错误。
相关文章推荐
- 关于调用静态链接库LIB,提示重定义或库冲突的错误
- 在头文件中用宏定义来避免重复包含,仍然会出现函数重定义的错误
- Print 数据正确,而debug 时窗口显示错误 原因之一: 预编译宏定义 在不同的project 下(属同一solution)定义不一致
- 宏定义和函数定义冲突会怎样?
- 定义的枚举莫名其妙的编译错误
- 一个C++宏定义与枚举定义重复的编译错误
- 记一个编译错误:命名冲突、宏定义、头文件包含顺序
- 如何避免重复宏定义?重定义错误
- 【C语言】第九篇·枚举、定义类型和宏定义
- 在头文件中用宏定义来避免重复包含,仍然会出现函数重定义的错误
- 关于调用静态链接库LIB,提示重定义或库冲突的错误
- 【C语言】C语言之枚举定义和宏定义的技巧1
- 一个用枚举类型定义错误码的Demo
- 有关_sprintf函数重定义错误的思考
- ADODB.Recordset 错误 '800a0bb9' 参数类型不正确,或不在可以接受的范围之内,或与其他参数冲突。
- Highcharts控件使用说明及注意事项, 错误: 'Highcharts' 未定义 错误: 'jb' 为空或不是对象
- 构造函数不能有返回类型 ,函数定义或声明中有错误;未调用函数
- 定义枚举的构造函数,方法和字段
- 定义下拉框,枚举
- Sys.WebForms.PageRequestManager 运行出现Sys未定义错误解决办法