Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 未命名的命名空间_C++_Namespaces - Fatal编程技术网

C++ 未命名的命名空间

C++ 未命名的命名空间,c++,namespaces,C++,Namespaces,当标准规定 $7.3.1.1/2-“静电传感器的使用 声明时不推荐使用关键字 命名空间范围中的变量(请参见 附录D);未命名名称空间 提供了一个更好的选择。” 我已经提到,但它不包括我所寻找的 有没有一个例子可以清楚地说明这种优越性 注意:我知道未命名的名称空间如何使外部变量在翻译单元中可见,但却对其他翻译单元隐藏它们。但这篇文章的重点是关于“静态命名空间范围”名称(例如全局静态变量)这是: static int func_for_this_file_only() { ... } “和”这个一

当标准规定

$7.3.1.1/2-“静电传感器的使用 声明时不推荐使用关键字 命名空间范围中的变量(请参见 附录D);未命名名称空间 提供了一个更好的选择。”

我已经提到,但它不包括我所寻找的

有没有一个例子可以清楚地说明这种优越性

注意:我知道未命名的名称空间如何使外部变量在翻译单元中可见,但却对其他翻译单元隐藏它们。但这篇文章的重点是关于“静态命名空间范围”名称(例如全局静态变量)

这是:

static int func_for_this_file_only() { ... }
“和”这个一样好:

但是
static
不能用于此:

namespace { class class_for_this_file_only { ... } }

因此,C++中的匿名命名空间更具通用性,优于static < /C> (我相信有人会反驳这个结论,但作为一名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,但这不是我应该提出的)。我认为我的例子是一个更好的名称空间论证,但他的例子更具体地回答了你的问题。