【问题标题】:Why aren't include guards or pragma once working?为什么不包括警卫或编译指示一旦工作?
【发布时间】:2009-11-24 04:39:31
【问题描述】:

我正在编译一些依赖于包含保护来防止对象和函数的多个定义的代码,但是 Visual Studio 2008 给我的链接错误是有多个定义。我不明白为什么,因为我以前使用过与此非常相似的代码并且它没有引起问题。我一定在做一些愚蠢的事情,但我不知道它是什么。我还尝试取出包含防护并使用#pragma 一次,但我得到相同的链接错误。我应该检查什么?

【问题讨论】:

    标签: c++


    【解决方案1】:

    如果它们是链接器错误,最可能的原因可能是标头中定义的非内联函数。

    如果您在包含在多个源文件中的标头中有一个非内联函数,它将在每个源文件(“翻译单元”)中定义,因此该函数将被定义多次,因此出现多重定义错误。

    【讨论】:

    • 你也可以通过制作模板来制作弱符号
    • 8 年后,这仍然很有帮助。
    • 10 年后,这仍然有用:D
    • 对于任何阅读这篇文章的人都被困在处理这些信息上:我能想到的最简单的解决方案就是将它们设为静态
    【解决方案2】:

    如果您遇到链接器错误...您确定您不是 1) 实际上在代码中定义了两次函数或 2) 尝试做一些愚蠢的事情,例如 #include 源文件(而不是标题文件)?

    【讨论】:

      【解决方案3】:

      这也可能是由于使用了来自其他库链接的不同版本的 cstd 库。检查 c++/代码生成部分并确保所有项目都使用相同的设置。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-13
        • 1970-01-01
        • 1970-01-01
        • 2011-07-19
        • 2011-07-08
        • 1970-01-01
        • 2011-06-19
        相关资源
        最近更新 更多