【问题标题】:What is the reason for the entire C++ STL code to be included in the .h rather than .cpp/.c files?将整个 C++ STL 代码包含在 .h 而不是 .cpp/.c 文件中的原因是什么?
【发布时间】:2009-11-14 03:21:40
【问题描述】:

我刚刚下载了 STL 源代码,我注意到 STL 模板类的所有定义都包含在 .h 文件中。函数定义的实际源代码位于 .h 文件而不是 .cpp/.c 文件中。这是什么原因?

http://www.sgi.com/tech/stl/download.html

【问题讨论】:

    标签: c++ class templates stl


    【解决方案1】:

    因为很少有编译器实现模板的链接。很难。

    这是一篇简短但(我认为)内容丰富的文章:http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=53

    我说“我认为”是因为它确实不是我非常熟悉的东西,只是它广泛未实现。我最初说标准不需要它,但是查看 C++03 中“导出”的定义,我没有看到任何迹象表明它是可选的。也许这只是一个失败的标准。

    【讨论】:

    • 谢谢,就在前几天我真的想知道 c++ 如何链接到模板!
    • export 是 C++98 标准的一部分,但正如你所说,大多数编译器不支持它(最后我检查过,g++ 团队对实现它没有兴趣)。
    • “export”关键字很可能在下一版本的 C++ 标准中被弃用。见herbsutter.wordpress.com/2009/10/23/…
    • 已弃用,呵呵。因此,如果它在 C++0x 中被弃用,那么它甚至可能在“C++ ......嗯......也许在 Duke Nukem Forever 上市后的某个时候”以某种方式被改变。到那时,人们可能已经想出了如何实现它;-)
    • 这不是唯一的吗?问题是即使支持它也对 STL 没有用处,因为它的编写者不知道您要使用哪种类型来实例化模板...
    【解决方案2】:

    将模板视为代码生成。如果您事先不知道将使用什么模板,则无法编译。所以你需要将实现保留在标题中。

    这允许一些内联,这解释了为什么有时使用模板化的东西(如 std::sort)比在普通 C 中工作得更快。

    【讨论】:

    • 您忘记了(相当不幸的)导出关键字。
    • 我认为人们之前已经给出了足够的解释和链接,关于它、它的未实现以及它可能的未来;)
    猜你喜欢
    • 1970-01-01
    • 2013-02-25
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    • 2012-03-04
    • 1970-01-01
    • 2015-08-04
    • 1970-01-01
    相关资源
    最近更新 更多