官方定义
namespace是指 标识符的各种可见范围。命名空间用关键字namespace来定义。 命名空间是C++的一种机制,用来把单个标识符下的大量有逻辑联系的程序实体组合到一起。此标识符作为此组群的名字。
基本使用
编译及执行命令:
g++ test.cpp -o test
./test
以最简单的输入(cin)输出(cout)流为例:
#include<iostream>
int main() {
std::cout << "testing" << std::endl;
}
如果加上使用命名空间,代码则可简化为:
#include<iostream>
using namespace std;
int main() {
cout << "testing" << endl;
}
遇到的冲突问题
现在我在改EzPC(一个非常大的基于C++的隐私计算框架),希望加上armadillo库以更好地支持复杂的矩阵运算。
加上这两行后,开始编译,于是出现了如下的一大堆报错:
分析上面的报错信息,大概可以知道问题在于:armadillo库和原框架中的MathFunctions中都存在同样的math函数,导致编译过程中,编译器不知道math->ReLU这类操作调用的哪个math。所以,上面也报错说“ambiguous(含糊不清的)”。
冲突解决
我这里采用的最简单的方法解决这个命名冲突,直接不对armadillo库使用命名空间,这样就不存在“调math时不清楚是arma中的math还是原框架中另一个库的math”这个问题了。
也就是说,我在代码中使用armadillo时(比如调用cube类),不能直接写成:
cube x = cube(1, 2, 3)
而应该写成完整形式:
arma::cube x = arma::cube(1, 2, 3)
测试一下,编译通过!
再测试一下armadillo能否顺利使用:
std::cout << "convert array to cube" << std::endl;
// arma::cube image = arma::cube(H, W, C);
arma::cube image = arma::cube(1, 2, 3);
std::cout << image << std::endl;
没有问题,bingo