未命名的命名空间如何优于
static
关键字?static
关键字?//legal code
static int sample_function() { /* function body */ }
static int sample_variable;
但是这段代码是无效的:
//illegal code
static class sample_class { /* class body */ };
static struct sample_struct { /* struct body */ };
namespace
,其如下所示://legal code
namespace
{
class sample_class { /* class body */ };
struct sample_struct { /* struct body */ };
}
希望这能解释为什么匿名的 namespace
比 static
更好。
.cpp
中,链接错误是由于定义了一个与之前相同名称的类所致。 - Xaqq这涉及到一个有趣的问题:
假设您使用 static
关键字或未命名的 namespace
使某些函数对模块(翻译单元)内部可见,因为该函数旨在仅在模块内部使用,而不可在模块外部访问。(未命名的 namespace
还具有使数据和类型定义内部化的优点,除了函数以外)。
随着实现您的模块的源文件逐渐变大,您可能希望将其拆分为几个单独的源文件,这将有助于更好地组织代码,更快地找到定义,并独立编译。
但是现在您面临一个问题:那些函数不能再被看作是对模块 static
的,因为 static
实际上指的是 源文件(翻译单元),而不是 模块。 您必须使它们非 static
,以允许从该模块的其他部分(目标文件)访问它们。但这也意味着它们不再隐藏/私有于该模块:由于具有外部链接,它们可以被其他模块访问,这不是您最初的意图。
未命名的namespace
也无法解决这个问题,因为它也是针对特定源文件(翻译单元)定义的,无法从外部访问。
如果能够指定某些namespace
为private
,那就太好了,也就是说,其中定义的任何内容都是模块内部使用的。但当然,C++没有"模块"这样的概念,只有与源文件紧密绑定的"翻译单元"。
static
才能正常工作。 - legends2k