C++ 未命名的命名空间
当标准规定 $7.3.1.1/2-“静电传感器的使用 声明时不推荐使用关键字 命名空间范围中的变量(请参见 附录D);未命名名称空间 提供了一个更好的选择。” 我已经提到,但它不包括我所寻找的 有没有一个例子可以清楚地说明这种优越性 注意:我知道未命名的名称空间如何使外部变量在翻译单元中可见,但却对其他翻译单元隐藏它们。但这篇文章的重点是关于“静态命名空间范围”名称(例如全局静态变量)这是:C++ 未命名的命名空间,c++,namespaces,C++,Namespaces,当标准规定 $7.3.1.1/2-“静电传感器的使用 声明时不推荐使用关键字 命名空间范围中的变量(请参见 附录D);未命名名称空间 提供了一个更好的选择。” 我已经提到,但它不包括我所寻找的 有没有一个例子可以清楚地说明这种优越性 注意:我知道未命名的名称空间如何使外部变量在翻译单元中可见,但却对其他翻译单元隐藏它们。但这篇文章的重点是关于“静态命名空间范围”名称(例如全局静态变量)这是: static int func_for_this_file_only() { ... } “和”这个一
static int func_for_this_file_only() { ... }
“和”这个一样好:
但是static
不能用于此:
namespace { class class_for_this_file_only { ... } }
因此,C++中的匿名命名空间更具通用性,优于
#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>();
}
在C++98中,对于可以作为模板参数的对象,外部链接是必需的,例如,如果要在char常量*
上进行模板化,则必须是指向具有外部链接的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>();
}
#包括
//使用“-D LINKAGE=static”编译以查看“static”的问题
#ifndef连接
#定义链接外部
#恩迪夫
模板
void foo()
{
std::cout目标是定义仅存在于您自己的翻译单元中的符号。这可以是“翻译单元全局”,也可以是变量或函数
这通常在类定义文件中用作私有静态类成员的替代方法,因为静态成员必须在头中声明,但自由函数不必声明(除非它必须是朋友,顺便说一下,它实际上不需要是朋友)
静电的使用将是:
static size_t BUFSIZE = 2048; // assume not const for this example
static int myCallback( void * ptr );
匿名名称空间的使用是不允许的
namespace {
size_t BUFSIZE = 2048;
int myCallback( void * ptr );
}
该标准说第二种构造是首选的。我们发现,有时除了匿名名称空间之外,还可以使用静态名称空间来实际减少二进制大小。有趣的是,ISO/IEC 14882:2011(C++11)删除了这种语言(事实上,它删除了整段§7.3.1.1/2)它还删除了附录D中提到的静态
因此,使用存储类说明符static
来命名内部链接仍然有效(§3.5/3)并且不再被反对。我认为您链接到的问题非常清楚地展示了它的优势。您在寻找什么?@Andreas Brinck:没有。我正在查看一些代码示例或情况,在OPI中引用的标准中,与未命名的命名空间相比,static有一个劣势。我认为您是错误的解释重新定义全局静态变量的含义
。这些变量不是真正的全局变量(在转换单元之外看不到它们)。注意全局变量可以是外部变量或静态变量(不是两者都有)。有趣。但标准引用是关于“在名称空间范围内声明变量”的。如果在不同的翻译单元中使用不同的上下文创建了同名的类,则有助于强制执行“一个定义”规则。@Chubsdad-有关标准的含义,请参阅下面的@Alf的答案。这是一个相当技术性的细节,但C++有很多这样的例子(部分原因是我更喜欢C,但这不是我应该提出的)。我认为我的例子是一个更好的名称空间论证,但他的例子更具体地回答了你的问题。