前几天发现同事定义了一个头文件,头文件的格式大体如下:
出现编译错误的原因就是宏定义根本就不属于该命名空间,宏定义不属于C++语句,宏定义在预处理阶段执行,而namespace属于c++语句在编译阶段执行,预处理在编译执行之前,预处理阶段对宏定义所做的工作就是代码替换,namespace并不具备对宏定义的管辖权,因此当出现类似“mySpace::MESSAGE_1”的代码时就会出现编译错误,所以对宏定义使用namespace来达到防止命名污染的效果显然是无法实现的,但是可以通过使用const常量的方式到达这种效果,例如,对以上代码做如下改写:
#ifndef _TESTCOMMON_H__
#define _TESTCOMMON_H__
namespace mySpace
{
#define MESSAGE_1 1001
#define MESSAGE_2 1002
}
#endif
在源程序中如果首先加入了这条语句“
using namespace mySpace;”的话,然后直接使用宏定义时,是没有任何问题的,但是如果使用
mySpace::MESSAGE_1就会出现编译错误。
testPro1.cpp:8:37: error: expected unqualified-id before numeric constant
testPro1.cpp:8:37: error: expected ';' before numeric constant
#ifndef _TESTCOMMON_H__
#define _TESTCOMMON_H__
namespace mySpace
{
//#define MESSAGE_1 1001
//#define MESSAGE_2 1002
const int MESSAGE_1 = 1001;
const int MESSAGE_2 = 1002;
}
#endif
此时,再调用mySpace::MESSAGE_1就不会产生编译错误了。