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黑客,我认为匿名命名空间解决方案更好.)
有趣的是,ISO/IEC 14882:2011(C++ 11)删除了这种语言(事实上,它删除了整个段落§7.3.1.1/ 2).它也删除了static附件D 中的提及.
因此,使用存储类说明符static给出名称内部链接仍然有效(§3.5/ 3)并且不再被弃用.