相关疑难解决方法(0)

未命名/匿名命名空间与静态函数

C++的一个特性是能够创建未命名(匿名)命名空间,如下所示:

namespace {
    int cannotAccessOutsideThisFile() { ... }
} // namespace
Run Code Online (Sandbox Code Playgroud)

您会认为这样的功能是无用的 - 因为您无法指定命名空间的名称,所以无法从外部访问其中的任何内容.但是这些未命名命名空间可以在它们创建的文件访问,就好像你有一个隐含的using子句.

我的问题是,为什么或何时使用静态函数会更好?或者他们基本上是两种做同样事情的方式?

c++ namespaces

486
推荐指数
8
解决办法
20万
查看次数

118
推荐指数
3
解决办法
3万
查看次数

为什么一个未命名的命名空间是静态的"优越"替代品?

C++标准中的$ 7.3.1.1/2节描述如下:

在声明命名空间作用域中的对象时,不推荐使用static关键字; unnamed-namespace提供了一个更好的选择.

我不明白为什么一个未命名的命名空间被认为是一个更好的选择?理由是什么?我已经知道标准的内容很长一段时间,但我从未认真考虑过,即使我回答这个问题:未命名的命名空间优于静态?

它是否被认为是优越的,因为它也可以应用于用户定义的类型,正如我在回答中所描述的那样?还是有其他原因,我不知道?我问这个问题,特别是因为这是我在答案中的推理,而标准可能会考虑其他因素.

c++ standards iso namespaces

86
推荐指数
3
解决办法
3万
查看次数

弃用静态关键字...不再?

在C++中,可以static在翻译单元中使用关键字来影响符号的可见性(变量或函数声明).

在n3092,这被弃用了:

附件D.2 [depr.static]
在命名空间范围内声明对象时,不推荐使用static关键字(见3.3.6).

在n3225中,这已被删除.

我能找到唯一一篇文章有些不正式.

它确实强调,为了与C兼容(以及将C程序编译为C++的能力),弃用令人讨厌.但是,直接将C程序编译为C++本身就是一种令人沮丧的经历,所以我不确定它是否值得考虑.

有谁知道为什么它被改变了?

c++ standards static c++11

84
推荐指数
3
解决办法
2万
查看次数

在C++ 11中,namespace-`static仍然被弃用吗?

可能重复:
静态关键字的弃用...不再?

在C++ 2003中,static不推荐使用namespace- :

[C++03: 7.3.1.1/2]:static在声明命名空间范围内的对象时,不推荐使用该关键字(见附录D); 所述 未命名的命名空间提供了一个更好的选择.

我无法找到C++ 2011中存在任何此类子句的位置(建议不引用),并且7.1.1似乎没有禁止命名空间 - static(如果有的话,这表明该功能最终已从语言中删除); 然而,这两个案例都没有列入C.2(这表明2003年和2011年之间存在重大差异).

名称空间是否static未被提及?

c++ c++11

20
推荐指数
1
解决办法
1992
查看次数

常规命名空间内匿名命名空间内符号的链接

在C++中,将函数或变量放在匿名命名空间中会使其内部链接,即与static在文件级别上声明它相同,但却是惯用的C++.

普通命名空间中的匿名命名空间怎么样?它仍然保证内部联系吗?

// foo.cpp

void func1() {
    // external linkage
}

static void func2() {
    // internal linkage
}

namespace {
    void func3() {
        // internal linkage
    }
}

namespace ns1 {
    void func4() {
        // external linkage
    }

    namespace {
        void func3() {
            // still internal linkage?
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

c++ namespaces anonymous linkage

14
推荐指数
3
解决办法
7238
查看次数