static关键字在命名空间范围内没用吗?

问题描述 投票:20回答:6
namespace N
{
   static int x = 5;
}

在命名空间范围内声明拥有静态变量的重要性/用例是什么?

c++ static namespaces scope
6个回答
11
投票

附件D(兼容性特征)[C ++ 03]

D2:在命名空间作用域中声明对象时,不推荐使用static关键字。

使用未命名的命名空间,而不是this帖子中提到的。

static关键字赋予C中变量/对象的内部链接以及其他人在帖子中提到的命名空间范围内的C ++。

P.S:根据最新的草案(n3290),这个功能已经不合适了。在n3225,§7.3.1.1/2在场,但被淘汰出局。


29
投票

命名空间范围(全局或其他)的static变量具有内部链接。这意味着,无法从其他翻译单元访问它。它是声明它的翻译单元的内部。


1
投票

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


1
投票

C ++标准§7.3.1.1/ 2:

在声明命名空间范围内的对象时,不推荐使用static关键字(见附录D); unnamed-namespace提供了一个更好的选择。

除非未命名的命名空间在未来的标准it will be undeprecated中提供了一个更好的替代方案来实现C兼容性。


0
投票

与在全局命名空间中声明静态但仅在特定命名空间本地的静态相同。


0
投票

我同意Nawaz的回答:静态关键字在命名空间中并非完全无用:它定义了变量与翻译单元的内部链接。

例如: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。如果你删除static关键字并编译它,它肯定是multiple definition error。请运行程序并观察结果,您可能会感到惊讶。

static关键字使得包含包含名称空间声明的接口头的每个cpp实现文件(转换单元)都具有静态变量的内部链接副本。因此,即使您在命名空间中定义该变量,如果它是static keyworded,也不会有多重定义错误。(const相同,前面没有定义内部链接变量的extern,这就是如何在C ++中丢弃宏)因此,在命名空间中定义的变量是隐式静态的说法是错误的,静态在命名空间中并非完全无用。因为每个翻译单元都有该变量的一个副本,所以会占用空间。

但是,未命名的命名空间可以使其中的类声明无法从其他翻译单元进行,而static关键字无法“归属”某个类,因此这是未命名的命名空间的一个优点。此外,您可以在嵌套命名空间中使用未命名的命名空间来进行变量访问限制。未命名的命名空间旨在保护位置而不是提供接口。

© www.soinside.com 2019 - 2024. All rights reserved.