namespace N
{
static int x = 5;
}
声明在名称空间作用域中具有静态变量的重要性/用例是什么?
发布于 2011-05-18 01:27:23
与在全局命名空间中声明静态相同,但只是特定命名空间的局部命名空间。
发布于 2011-05-18 01:28:59
其他人已经说过的话,还有一个微妙之处:静态引入了内部链接,而匿名命名空间不会。
发布于 2018-04-26 12:04:45
我同意Nawaz的回答: static关键字在名称空间中并不是完全无用的:它定义了变量与翻译单元的内部链接。
例如: header.h
namespace test{
static int i = 5;//definition is here.And there will be no multiple definition!
void set_i();
void print_i();
}
header.cpp
#include "header.h"
#include "iostream"
void test::set_i()
{
i = 10;
return;
}
void test:print_i()
{
using namespace std;
cout << "print_i is " << i << endl;
return;
}
main.cpp
#include "header.h"
#include "iostream"
using std::cout;
int main()
{
test::i = 20;
test::set_i();
cout << "i is " << test::i << endl;
test::print_i();
return 0;
}
使用g++ -std=c++11 header.cpp main.cpp
编译它,你不会得到multiple definition error
.If,如果去掉static
关键字并编译它,它肯定是multiple definition error
。请务必运行程序并观察结果,您可能会感到惊讶。
static
关键字使得每个cpp实现文件(转换单元)都有一个静态变量的内部链接副本,其中包括包含名称空间声明的接口头。因此,即使您在名称空间中定义变量,如果它是static
关键字,也不会出现多重定义错误。(对于定义内部链接变量const
也是如此,这就是在C++中丢弃宏的方式)。因此,名称空间中定义的变量是隐式静态的说法是错误的,静态在名称空间中也不是完全无用的。因为每个转换单元都有该变量的一个副本,所以会消耗空间。
然而,未命名命名空间可以使其他翻译单元无法访问其中的类声明,而static
关键字不能对类进行“属性”,因此这是未命名命名空间的一个优点。此外,您还可以在嵌套的命名空间中使用未命名的命名空间,以进行变量访问限制。未命名命名空间旨在保护局部性,而不是提供接口。
https://stackoverflow.com/questions/6034654
复制相似问题