【问题标题】:duplicate symbol error C++重复符号错误 C++
【发布时间】:2010-05-24 05:38:26
【问题描述】:

我在我的文件中添加了一些 const 字符,如下所示。我得到的错误是重复符号_xyz(比如说)。它有什么问题,我该如何摆脱它。

const char* xyz = "xyz";
class Abc
{
public:
    Abc()
    {
    }
};

【问题讨论】:

    标签: c++


    【解决方案1】:

    如果这是在头文件中,则每次#include 时都会定义xyz

    您可以按照@R Samuel Klatchko 的说明更改声明。通常的方式(如果数据不是const)是这样的:

    在 Abc.h 中:

    extern char *xyz;
    

    在 Abc.cpp 中:

    char *xyz = "xyz";
    

    编辑添加

    请注意,标头保护不会解决此问题:

    #ifndef XYZ_H
    #define XYZ_H
    ...
    #endif
    

    标头保护可防止“重新定义”错误,即同一符号在同一编译单元中出现两次。这是一个编译器错误。

    但即使有标头保护,xyz 的定义仍会出现在包含它的每个源文件中,从而导致“重复符号”错误,即 链接器 错误。

    当然,如果原始海报提到这一点会更有帮助。

    【讨论】:

    • 多次声明一个变量不是错误(如果它不在同一个翻译单元中)。定义它是。
    • 感谢标题保护说明。不过,这是一件奇怪的事情 - 如果我在该标头中定义了一个函数,我只会收到重复符号的链接器错误。在我目前的情况下,我在标题中的命名空间中定义了一堆常量和几个函数 - 我只收到函数的链接器错误,const 是可以的。这是为什么呢?
    【解决方案2】:

    问题是每个包含头文件的源文件都有自己的 xyz 副本,并带有外部链接。

    解决此问题的最简单方法是提供xyz 内部链接。除了具有底层 char 的 const 之外,您还可以通过使指针本身为 const 来做到这一点:

    const char* const xyz = "xyz";
    

    【讨论】:

    • const 确实不错,但这只是隐藏了现在每个文件中都有相同数据的实例的问题。
    【解决方案3】:

    我也遇到了这个问题,但对我来说解决方案不同。我在头文件中放置了重载的运算符(==、!=、

    编辑

    这也可能是由以下原因引起的:

    • 您将包含.cpp 文件而不是.h 文件。您可以通过将导入切换为使用 .h 而不是 .cpp 来解决此问题。
    • 您正在头文件中(在类声明之外)实现静态函数。您可以通过将实现移动到 .cpp 文件(以及其他解决方案)来解决此问题。

    【讨论】:

    • 如果你有一个只有标题的库,也可以在运算符前面添加 static 关键字。
    【解决方案4】:

    我的用例:

    • 我有多个头文件a.hppb.hppc.hpp,其中包含一些实用方法。
    • 我有一个文件util.hpp,它充当上述文件的聚合器。

    就我而言,extern 不起作用,但 static 起作用。

    我不得不使用:

    • header guards 以避免 Visual Studio 代码中的错误。
    • static 具有避免编译时错误的功能。

    也请查看article

    【讨论】:

      【解决方案5】:

      请提供对问题的有意义的描述。什么是“我的档案”?你在谈论什么“const character”?

      到目前为止,我只能猜测您将xyz 的上述定义添加到头文件中,然后将其包含到几个翻译单元中。结果:对象xyz 被多次定义。因此出现错误。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-03
        • 2015-06-20
        • 1970-01-01
        • 2012-07-21
        相关资源
        最近更新 更多