//file.h
namespace Foo{
namespace{
void func(){}
}
}
对比
namespace Foo{
void func(){}
}
//file2.cpp use file.h's method
这两种方法在调用代码(例如在可见性方面)的结果(如果有的话)是什么?
最佳答案
这个:
namespace Foo {
namespace {
void func() {}
}
}
在很大程度上等同于此:
namespace Foo {
static void func() {}
}
不同的是,在static
的情况下,函数有内部链接,所以它对链接器是不可见的。在未命名命名空间的情况下,该函数具有外部链接(对链接器可见),但在您的其他源文件都无法“正常”访问的名称下。例如,如果您对编译器的名称修改方案进行逆向工程,您可能仍会从不同的源文件调用该函数,并且该函数仍列在目标文件的符号中。
但共同点是每个包含代码的源文件(可能通过 #include
头文件)将包含其自己的函数拷贝。这可能会影响二进制文件的大小。
此外,如果您出于某种原因需要第一个,您应该大量记录它。头文件中的未命名命名空间通常是一个“WTF”点,您不希望在您的代码中出现这些。我必须说我想不出一个可行的用例。
关于c++ - 匿名命名空间内的自由函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24485166/