首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >static关键字在命名空间作用域中无用吗?

static关键字在命名空间作用域中无用吗?
EN

Stack Overflow用户
提问于 2011-05-18 01:22:09
回答 3查看 19.6K关注 0票数 24
namespace N
{
   static int x = 5;
}

声明在名称空间作用域中具有静态变量的重要性/用例是什么?

EN

回答 3

Stack Overflow用户

发布于 2011-05-18 01:27:23

与在全局命名空间中声明静态相同,但只是特定命名空间的局部命名空间。

票数 0
EN

Stack Overflow用户

发布于 2011-05-18 01:28:59

其他人已经说过的话,还有一个微妙之处:静态引入了内部链接,而匿名命名空间不会。

票数 0
EN

Stack Overflow用户

发布于 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关键字不能对类进行“属性”,因此这是未命名命名空间的一个优点。此外,您还可以在嵌套的命名空间中使用未命名的命名空间,以进行变量访问限制。未命名命名空间旨在保护局部性,而不是提供接口。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6034654

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档