今天遇到一个命名空间重定义的问题,程序框架大体如下:
interface中定义的是一个namespace, 形式如下:
namespade np {
int a = 1;
int b = 2;
};
并且三个module(1,2,3),以及core模块全都需要引用这个命名空间中的数据(与消息传递有关),并且这几个模块是分别编译的,最后链接起来,编译module1, module2, module3, core时没有问题, 但是在链接时由于重复包含了interface.h头文件,其中的命名空间中的成员出现了重复定义的问题,这个命名空间默认是external链接属性的,所以各模块对该命名空间成员的引用出现重定义。
解决方案也很简单:用匿名命名空间把这个重定义的命名空间包起来即可,效果如下:
namespace {
namespace np1 {
int a =1;
int b = 2;
};
};
原理:
匿名的命名空间具有internal链接属性(同static), 只能在本文件中访问(其他文件也访问不了,因为不知道命名空间的名字下面的UNIQUE),本文件是知道匿名空间的名字的(默认添加&#x