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

时间:2011-05-17 17:22:09

标签: c++ static namespaces scope

namespace N
{
   static int x = 5;
}

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

6 个答案:

答案 0 :(得分:29)

命名空间范围内的

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

答案 1 :(得分:11)

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

  

D2:在声明命名空间范围内的对象时,不推荐使用static关键字。

使用未命名的命名空间,如this post。

中所述

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

P.S: 根据最新草稿(n3290),该功能已经不推荐。在n3225中,§7.3.1.1/2存在,但已被删除。

答案 2 :(得分:1)

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

例如: header.h

#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;
}

header.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;
}

的main.cpp

g++ -std=c++11 header.cpp main.cpp

使用multiple definition error进行编译,但您不会获得static。如果删除multiple definition error关键字并对其进行编译,则肯定是static。请运行程序并观察结果,您可能会感到惊讶。

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

但是,未命名的命名空间可以使其中的类声明无法从其他翻译单元进入,而var mongoose = require("mongoose"); var Schema = mongoose.Schema; var attendanceSchema = new Schema({ date: String, absent: [{ type: Schema.Types.ObjectId, ref: "User" }], realDate: { type: Date, default: new Date() } }); attendanceSchema.pre("validate", function(next) { var newDate = this.date; this.realDate = new Date(newDate); console.log("done"); next(); }); var Atten = mongoose.model("Attendance", attendanceSchema); module.exports = Atten; 关键字不能&#34;属性&#34;一个类,这是未命名的命名空间的一个优点。此外,您可以在嵌套命名空间中使用未命名的命名空间来进行变量访问限制。未命名的命名空间旨在保护位置而不是提供接口。