【问题标题】:c++ global variablesc++ 全局变量
【发布时间】:2012-09-09 11:34:37
【问题描述】:

我有一个头文件global.h,我在其中声明了一些我打算在其他文件中使用的变量。

#ifndef GLOBAL_H_
#define GLOBAL_H_

#include <stdio.h>

typedef struct tag_KG_Data
{
   int nKGStationID;
   int nKGComPort;

 }GLOBAL_VAR;

 GLOBAL_VAR g_GlobalVar;

 BOOL b_newDataReady;
 BOOL b_startedSocketClient;



#endif

起初我只在文件test1.cppextern GLOBAL_VAR g_GlobalVar; 中声明了GLOBAL_VAR g_GlobalVar,并且工作得很好。然后我声明了 2 个BOOLs 并在test2.cpp 中使用它们,但我得到了一个error LNK2005: "struct tag_KG_Data g_GlobalVar" (?g_GlobalVar@@3Utag_KG_Data@@A) already defined in test1.obj,并且对于我拥有的每个全局变量,我都会遇到类似的错误。问题是我不在test2.cpp 中使用GLOBAL_VAR g_GlobalVartest1.cpp 中的任何BOOLs。

【问题讨论】:

  • 所以你有一些工作,现在你已经改变了它,它不再工作了。那里有一个线索。
  • @PeteBecker 我同意,但我想了解为什么不起作用,而不仅仅是解决问题。

标签: c++ windows linker global-variables


【解决方案1】:

这是因为您在标头中定义全局变量,而您应该只声明它们。

在全局定义前添加extern,并在单个 cpp 文件中创建定义。

在标题中:

// Declarations
extern GLOBAL_VAR g_GlobalVar;
extern BOOL b_newDataReady;
extern BOOL b_startedSocketClient;

在 cpp 文件中:

// Definitions
GLOBAL_VAR g_GlobalVar;
BOOL b_newDataReady;
BOOL b_startedSocketClient;

【讨论】:

  • 好答案。另外一件事是,变量是否在 .cpp 文件中使用并不重要。因为每次包含 .h 文件时 .h 包含文件都会定义它们,所以会创建变量的新定义。因此,当具有全局变量的 .h 文件被其他 .h 文件包含时,您也可以获得相同的效果,而您确实有一个 #def #ifdef 保护以防止多个包含。 #include 是一个预处理器指令,用于将文件的文本拉入另一个文件,并在文本级别而不是编译代码级别工作。几乎从不在 .h 文件中声明变量。
  • 这解决了生成的错误。谢谢,答案也为我清除了一个模糊的 c++ 区域:)
猜你喜欢
  • 2015-06-12
  • 1970-01-01
  • 1970-01-01
  • 2018-07-20
  • 2012-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多