开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第13天,点击查看活动详情
【C++】浅谈C++的命名空间
namespace 命名空间
命名空间种类
unnamed-namespace
这样的命名的空间内的成员只对改文件可见,包含该文件的其他文件不可见。作用类似于C语言里的static,但是static只能修饰变量和函数,对于类无效。而c++用unnamed-namespace来取代。
namespace {
int num = 10;
class Foo {
public:
Foo() { std::cout<<"Create Foo.\n";}
~Foo() { std::cout<<"Destroyed Foo.\n";};
};
Foo foo;
} // namespace
namespace co {
void printLn(){ std::cout<<"print: "<<num<<"\n";}
}
-
作用域 未命名空间里的成员,与该命名空间所在的作用域相同,如果定义在最外层,即全局作用域。正如
std::cout<<"print: "<<num<<"\n";中直接使用num一样,此时要和全局作用域中的变量名不能重合,否则会二义性。 -
生命周期 用于静态生命周期 在第一次使用前创建,在整个程序结束时才销毁。
验证如下:
//main.cc #include"head.h" int main(int argc, char const *argv[]) { co::printLn(); return 0; }输出
$ g++ main.cc one.cc -o main $ ./main Create Foo. printLn10(); Destroyed Foo.由此可见,未命名空间的成员作用域是和在其第一次使用前开始,和程序一起结束。
全局命名空间
定义在所有的类、函数及命名空间之外定义的名字,也就是定义在全局命名空间。
比如全局命名空间中有成员num,显示的使用全局命名空间中的变量,方式是::num,如此就会在全局命名空间中查找该变量。
inline-namespace
即在命名空间前加上关键词inline,这是c++11的性质。使得上一级别的作用域可以直接使用该inline-namespace内的成员,而不用加前缀。
使用
using 声明
即具体的声明使用命名空间中的哪一个成员,比如:using std::string;
using 指示
开放全部:using namespace std;。不安全,不建议。