【发布时间】:2018-09-10 08:16:09
【问题描述】:
我一直在阅读有关声明匿名命名空间以缩短链接时间的文章。
但是,我已经读过,确实不建议在头文件中声明匿名命名空间:
在头文件中定义未命名的命名空间时,可能会导致令人惊讶的结果。由于默认的内部链接,每个翻译单元将定义其自己的唯一实例,该实例是在该翻译单元内 ODR 使用的未命名命名空间的成员。这可能会导致意外结果、使生成的可执行文件膨胀,或由于违反单一定义规则 (ODR) 而无意中触发未定义行为。
以上是从下面的链接中摘录的一段话,其中有几个匿名命名空间的意外行为示例: https://wiki.sei.cmu.edu/confluence/display/cplusplus/DCL59-CPP.+Do+not+define+an+unnamed+namespace+in+a+header+file
所以,我的问题是:
上述问题仅适用于匿名命名空间变量,不适用于方法。对吗?
使用 static 关键字强制与变量进行内部链接时是否会出现同样的问题?如果是这样,有没有其他方法可以安全地实现这一目标?
【问题讨论】:
-
“膨胀生成的可执行文件” - 适用于函数。恕我直言,安全的方法是在标头中声明具有内部链接的事物时知道您在做什么,无论您如何声明它们。
-
如果你想让事物有内部链接,也许你根本不应该把它们放在头文件中。
-
是的,同样的逻辑适用于头文件中的
static函数或变量,就像它适用于头文件中的匿名namespace。头文件不是放置内部链接的正确位置。