gpt4 book ai didi

c++ - 这个只有头文件的库如何防止链接器问题?

转载 作者:行者123 更新时间:2023-11-28 02:17:52 24 4
gpt4 key购买 nike

看完this question我以为我明白了一切,但后来我看到this file来自流行的仅 header 库。

该库使用 #ifndef 行,但 SO 问题指出这不足以防止多个 TU 中的多个定义错误。

所以下列其中一项必须为真:

  1. 可以通过 SO 问题中所述以外的方式避免多重定义链接器错误。也许图书馆正在使用其他 SO 问题中未提及的技术,这些技术值得额外解释。
  2. 该库假定您不会将其头文件包含在 more than translation 单元中——这看起来很脆弱,因为一个强大的库不应该对其用户做出这种假设。

如果能对这个看似简单的好奇心有所启发,我将不胜感激。

最佳答案

包含在多个翻译单元中时会导致链接问题的 header 将(尝试)在每个源文件中定义一些对象(不只是,对于一个明显的例子,一种类型),其中它包括在内。

例如,如果您在 header 中有类似这样的内容:int f = 0;,那么包含它的每个源文件都会尝试定义 f,当您尝试将目标文件链接在一起时,您会收到关于 f 的多个定义的投诉。

此 header 中使用的“技术”很简单:它不尝试定义任何实际对象。相反,它包括一些 typedef 和一个相当大的类的定义——但不包括该类的任何实例或任何其他任何实例。该类包括许多成员函数,但它们都在函数定义中定义,函数定义隐式地将它们定义为内联函数(因此在使用它们的每个翻译单元中单独定义不仅是允许的,而且是必需的)。

简而言之, header 仅定义类型,而不是对象,因此当它包含在链接在一起的多个源文件中时,不会引起链接器冲突。

关于c++ - 这个只有头文件的库如何防止链接器问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33487729/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com