未命名的命名空间

Chu*_*dad 14 c++ namespaces

当标准陈述时,它究竟意味着什么

$ 7.3.1.1/2 - "在命名空间作用域中声明变量时,不推荐使用static关键字(参见附录D); unnamed-namespace提供了一个更好的选择."

我已经提到了这个,但它没有涵盖我正在寻找的东西.

有没有一个例子可以清楚地证明其优越性.

注意:我知道未命名的命名空间如何在翻译单元中显示外部变量,并将其隐藏在其他翻译单元中.但这篇文章的重点是'静态命名空间范围'名称(例如全局静态变量)

Che*_*Alf 11

它究竟意味着什么?

技术上已弃用意味着未来的标准可能会删除该功能.

在实践中,由于需要支持旧代码,所以不会发生.

所以在实践中它意味着"强烈气馁".

未命名的命名空间的优越性示例

一个未命名的命名空间通常是优越的,因为您在该命名空间中拥有的可以具有外部链接.

在C++ 98中,外部链接对于可以作为模板参数的东西是必要的,例如,如果你想在a上模板化char const*,它必须是char具有外部链接的指针.

#include <iostream>

// Compile with "-D LINKAGE=static" to see problem with "static"
#ifndef LINKAGE
#   define LINKAGE extern
#endif

template< char const* s >
void foo()
{
    std::cout << s << std::endl;
}

namespace {
    LINKAGE char const message[] = "Hello, world!";
}  // namespace anon

int main()
{
    foo<message>();
}
Run Code Online (Sandbox Code Playgroud)

也就是说,它有点不一致,static也没有被弃用的功能.


Chr*_*utz 10

这个:

static int func_for_this_file_only() { ... }
Run Code Online (Sandbox Code Playgroud)

是这样的"好"

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

static不能用于此:

namespace { class class_for_this_file_only { ... } }
Run Code Online (Sandbox Code Playgroud)

因此,C++中的匿名命名空间更通用,更优越static.

(我相信有人会争论这个结论,但作为一名C黑客,我认为匿名命名空间解决方案更好.)


Kon*_*lph 6

有趣的是,ISO/IEC 14882:2011(C++ 11)删除了这种语言(事实上,它删除了整个段落§7.3.1.1/ 2).它也删除了static附件D 中的提及.

因此,使用存储类说明符static给出名称内部链接仍然有效(§3.5/ 3)并且不再被弃用.