如何为头文件声明“include”以避免“错误lnk2005”` < >我创建了一个新的Win32 C++项目。我还没有接触主文件中的任何代码,而是开始在另一个文件objectsFW.cpp中编写代码。该文件的定义位于objectsFW.h文件中

如何为头文件声明“include”以避免“错误lnk2005”` < >我创建了一个新的Win32 C++项目。我还没有接触主文件中的任何代码,而是开始在另一个文件objectsFW.cpp中编写代码。该文件的定义位于objectsFW.h文件中,c++,visual-studio-2012,linker,C++,Visual Studio 2012,Linker,objFW.h看起来像: #pragma once double g; typedef struct { double x; double y; }Vector; typedef struct { //... }BoundingBox; typedef struct { //... }Ball; Vector operator + (Vector a, Vector b) { //... } Vector operator - (Vector

objFW.h看起来像:

#pragma once

double g;

typedef struct {
    double x;
    double y;
}Vector;

typedef struct {
    //...
}BoundingBox;

typedef struct {
    //...
}Ball;

Vector operator + (Vector a, Vector b) {
    //...
}

Vector operator - (Vector a, Vector b) {
    //...
}
还定义了一些运算符和函数的声明。 我将头文件包括在源文件objectsFW.cpp中,并将其添加到Resources.h文件中,以便我的代码可以在主程序中使用

我收到链接器错误:

Error   1   error LNK2005: "struct Vector __cdecl operator*(struct Vector,double)" (??D@YA?AUVector@@U0@N@Z) already defined in ObjectsFW.obj   C:\testC\ObjectsCollision\ObjectsCollision\ObjectsCollision.obj ObjectsCollision
...
Error   4   error LNK2005: "struct Vector __cdecl operator+(struct Vector,struct Vector)" (??H@YA?AUVector@@U0@0@Z) already defined in ObjectsFW.obj    C:\testC\ObjectsCollision\ObjectsCollision\ObjectsCollision.obj ObjectsCollision
等等

我知道这是因为include objectFW.h行在每个.cpp文件中出现两次。问题是什么是声明头文件以避免链接器错误的正确方法

更新: 在将运算符函数转为内联大多数已修复的错误后,仍有一个程序具有以下行:

double g;
错误是:

Error   1   error LNK2005: "double g" (?g@@3NA) already defined in ObjectsCollision.obj C:\testC\ObjectsCollision\ObjectsCollision\ObjectsFW.obj    ObjectsCollision
正在使用Visual Studio 2012

将以下内容放入标题:

extern double g;
在.cpp中:

double g;
这样,每个包含头的文件都会知道有一个变量g,但它只在一个位置声明。

关于全局变量: 1.不要使用它们。想想封装和数据隐藏。 2.如果必须使用它们,请在源文件中定义全局in 1,并将extern放在头文件中

例如: 头文件\u file.hpp:

source_file.cpp:

隐藏全局变量的更好方法 控制隐藏全局变量的更好方法是将使用该变量的所有代码放在同一源文件中,并将该变量声明为静态:


此技术允许您在设置变量时放置过滤器或其他控件

将操作符声明为内联。^要么声明为内联,要么在.cp文件中实现它们。在C++中,不需要TyPufFrase{} MyOxStult成语。您可以使用较短的语法:struct my_struct{};你是用C还是C++编程?这是语言不同的地方。另外,不要在头文件中放置全局变量。将变量放在源文件中,并将extern声明放在头文件中。此外,尽最大努力消除全局变量;它们会导致许多问题,特别是在多线程环境中。
  extern unsigned int deadly_global;
  unsigned int deadly_global;
  static unsigned int variable_shared_by_many_functions = 0;
  void f1(void)
  {
    variable_shared_by_many_functions = 42U;
  }

  void f2(void)
  {
    std::cout << "Value of shared variable: "
              << variable_shared_by_many_functions
              << "\n";
  }
  static int dangerous_variable = 0;

  int accessor(void)
  {
     // Return a copy of the varible.
     return dangerous_variable;
  }

  void setter(int new_value)
  {
    if ((new_value / 5) != 1)
    {
       dangerous_variable = new_value;
    }
  }