c++ - 匿名命名空间内的自由函数

标签 c++

//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/

相关文章:

c++ - 无法输出到输出文件

c++ - INPUT类的C++错误(变量周围的堆栈已损坏。)

c++ - undefined reference ?

c++ - 使用 OpenGL 绘制多个对象时遇到问题

c++ - 从信号处理程序中引发异常

c++ - 为结构读取 C++ 中的二进制文件的运行时错误

C++在范围结束后丢失指针引用

c++ - SFML 平台游戏与 map 图 block 发生碰撞

C++打印 boolean 值,显示什么?

c++ - 构造函数中的 std::bind 到类中的回调方法