【问题标题】:Error already defined错误已定义
【发布时间】:2014-10-17 12:51:56
【问题描述】:

您好,我刚刚创建了一个示例类并在 main 中使用它,但我遇到了已经定义的错误。

sample.h

#ifndef __sample__
#define __sample__
#include<iostream>
using namespace std;

int count = 10;

class sample
{
public:
    sample();
    int Get();
private:
    int i;
};
#endif

sample.cpp

#include "sample.h"
sample::sample()
{
    cout<<"hello two";
}
int sample::sample()
{
    return 10;
}

ma​​in.cpp

#include <iostream>
#include "sample.h"
using namespace std;

int main(void)
{
    int test = count;
    return 0;
}

链接错误: main.obj : 错误 LNK2005: "int count" (?count@@3HA) 已在 sample.obj 中定义

如果您看到上面的类,我正在使用#ifndef 和#define,实际上,一旦我们认为我们在很多地方都包含数据,就会声明数据。有人可以清楚地解释为什么它会给出该链接错误。

【问题讨论】:

  • 我相信你的意思是int sample::Get()
  • __sample__ 是保留标识符。
  • 有多个问题需要解决,不仅仅是定义问题。 @T.C.那条编辑消息让我笑了
  • error LNK2005, already defined? 的可能重复项

标签: c++ visual-c++


【解决方案1】:

请记住,#include 的字面意思是“在此处添加此文件的内容”。
包含保护仅防止文件的内容被多次包含每个包含在其中的文件

当预处理器完成预处理后,编译器会看到:

sample.cpp

[iostream 内容在这里...]

using namespace std;

int count = 10;

class sample
{
public:
    sample();
    int Get();
private:
    int i;
};

sample::sample()
{
    cout<<"hello two";
}
int sample::sample()
{
    return 10;
}

ma​​in.cpp

[iostream 内容在这里...]

using namespace std;

int count = 10;

class sample
{
public:
    sample();
    int Get();
private:
    int i;
};

using namespace std;

int main(void)
{
    int test = count;
    return 0;
}

如您所见,count两个定义,每个文件中都有一个(正式称为“翻译单元”)。

解决方案是在“sample.h”中声明变量

extern int count;

并且在 sample.cpp 中拥有唯一的定义

int count = 10;

(而且您不应该将using namespace std; 放在标题中。)

【讨论】:

  • 比我在this post弄得一团糟好多了。
【解决方案2】:

要使这样的全局变量随处可见:

废话.h

extern int count;

blah.cpp

int count(10);

【讨论】:

    【解决方案3】:

    Include 守卫只防止多次包含同一个头文件,而不是防止多个定义。您应该将变量移动到 cpp 文件中,以免违反ODR,或使用内部链接或将其声明为外部并在某处定义一次。根据该变量的用途,有多种解决方案。

    请注意,我忽略了您在 sample.cpp 文件中可能指的是 int sample::Get() 的事实

    #include "sample.h"
    sample::sample()
    {
        cout<<"hello two";
    }
    int sample::sample() // ??
    {
        return 10;
    }
    

    【讨论】:

      【解决方案4】:

      您必须将变量计数声明为具有内部链接,例如

      #ifndef __sample__
      #define __sample__
      #include<iostream>
      using namespace std;
      
      namespace
      {
          int count = 10;
      }
      //...
      
      #endif
      

      (上述内部声明在 C++ 2011 中有效)或

      #ifndef __sample__
      #define __sample__
      #include<iostream>
      using namespace std;
      
      static int count = 10;
      
      //...
      
      #endif
      

      或者将其声明为具有外部链接但在某个模块中仅定义一次。 Fpr 示例

      #ifndef __sample__
      #define __sample__
      #include<iostream>
      using namespace std;
      
      extern int count;
      
      //...
      
      #endif
      
      #include "sample.h"
      
      int count = 10;
      sample::sample()
      {
          cout<<"hello two";
      }
      int sample::sample()
      {
          return 10;
      }
      

      否则编译器将发出一个错误,即多次定义变量计数,即多个编译单元(在本例中为 sample.cpp 和 main.cpp)包含变量定义。

      【讨论】:

      • 将非常量变量放在匿名命名空间/静态标题中可能会引起混淆,因为每个翻译单元都有自己的副本。
      • @Dave S 没有什么困惑。一切都取决于您的设计,
      猜你喜欢
      • 2012-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-11
      • 2012-08-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多