//file.h
namespace Foo{
namespace{
void func(){}
}
}
vs
namespace Foo{
void func(){}
}
//file2.cpp use file.h's method
这两种方法在调用代码中(例如可见性方面)会有什么后果(如果有的话)?
//file.h
namespace Foo{
namespace{
void func(){}
}
}
vs
namespace Foo{
void func(){}
}
//file2.cpp use file.h's method
This:
namespace Foo {
namespace {
void func() {}
}
}
大体上等同于这个:
namespace Foo {
static void func() {}
}
static
的情况下,函数具有内部链接,因此连接器无法访问它。在未命名命名空间的情况下,函数具有外部链接(对连接器可见),但是使用一个其他源文件“通常”无法访问的名称。例如,您可以通过反向工程编译器的名称重整方案从不同的源文件调用该函数,并且该函数仍然列在对象文件的符号中。#include
头文件)都将包含其自己的函数副本。这可能会影响二进制文件的大小。namespace Foo
{
namespace TranslationUnitSpecific
{
void func();
}
}
func
实例。如果 func
不是 inline
,则必须在每个使用它的源文件中定义它。(另一方面,这意味着您可以在头文件中提供实现,而不必使函数成为 inline
。)inline
或模板函数中使用,否则有违反单一定义规则的风险,可能导致未定义的行为。Foo::func()
的情况下找到该函数。但是编译器可能会在这两种情况下生成不同的代码。在匿名命名空间内声明一个函数使该函数局限于 .cpp
文件。也就是说,每个包含头文件的 .cpp
文件可能最终都会有自己的(相同的)func
代码实例。这可能会导致最终可执行文件中出现一些膨胀,因为代码被重复了。请注意,如果您定义了内联函数(如您的问题所建议的那样),则这不是真正的问题,因为由于内联而无论如何都会复制代码。尽管如评论中所指出的那样:头文件中的匿名命名空间很少见,并且会引起任何审核此代码的人的怀疑。除非您有非常好的理由,否则应始终优先选择第二个选项。