C 无需使用匿名名称空间即可实现内部链接
C++ achieve internal linkage without using anonymous namespaces
我一直在阅读有关宣布匿名名称空间以实现较低链接时间的信息。
但是,我已经读到不建议在标题文件中声明匿名名称空间:
在标题文件中定义了未命名的名称空间时,它可能会导致令人惊讶的结果。由于默认的内部链接,每个翻译单元将定义其自己的唯一实例在该翻译单元中使用的未命名名称空间的成员。这可能会导致意外的结果,膨胀由于违法行为(ODR(而导致的可执行文件或无意中触发不确定的行为。
以上是从下面的链接中提取的引用,其中有几个匿名名称空间的意外行为的示例:https://wiki.sei.cmu.edu/confluence/display/cplusplay/dcl59-cpp. do not define define define an unnamed namef namednamed namespace in a in header header file
所以,我的问题是:
上述问题仅适用于匿名名称空间变量,而不是方法。是的吗?
使用静态关键字将内部链接与变量强制内部链接时会出现相同的问题吗?如果是这样,还有其他方法可以安全地实现这一目标吗?
上述问题仅适用于匿名名称空间变量,而不是方法。是的吗?
提到的问题发生在匿名名称空间内的任何事情中。
使用静态关键字将内部链接与变量强制内部链接时会出现相同的问题吗?
也发生了同样的事情。
如果是这样,还有其他方法可以安全地实现这一目标吗?
没有。
如果将包含在不同的翻译单元中的标头文件中,将很快或以后发生。如果任何具有外部链接的实体在其定义或声明中使用内部链接中的一个实体之一。
,您将很快遇到问题。在匿名名称空间内声明的任何实体,那些声明为静态和非前方const变量具有内部链接。
据称您是您所在的2个部分解决方案:
内联变量和函数可以在mutliple翻译单元内显示其定义,因此可以安全地在标题文件中定义它们。
如果您要寻找的内容不是要在库外面进行名称visibles,请在私人标头中定义它们,并将其应用于它们的可见性属性(
[[gnu:visibility("hidden")]]
或无__dllexprot
,MSVC(
- C++Union/Struct位域的实现和可移植性
- 在Qt中实现无限可缩放的画布
- C++标准是否允许<double>在没有开销的情况下实现 std::可选
- 可视化 Bazel C++预编译标头实现
- 命名空间 std:: 不包含可选
- 是否有可能实现O(N)时间和O(1)空间解决方案,以实现C++中的字符串循环移位
- std::可选实现为联合与字符[]/aligned_storage
- 提升 Websocket 并io_context可重用性,以实现连接的可重新建立性
- 模板实现文件中的匿名命名空间
- 可视化 如何实现 c++ 列表的运算符=?
- 在C++中将内部类实现为具有名称空间的独立类有什么好处
- C++:实现定义了可接受的物理源文件字符
- 在命名空间内部还是外部实现 c++ 函数?
- 在C++中获取命名空间名称的任何可移植技巧
- 与shared_ptr相比,更小的运行时数据结构和更快的代码可实现独特的_ptr
- 如何在类中实现可选择的类似命名空间的功能?
- C 无需使用匿名名称空间即可实现内部链接
- 直观的内存布局,可实现快速SIMD/面向数据的设计
- C++11中的所有STL都是用户可实现的吗
- 是在用户空间中实现的c++ 11互斥锁