我在header.h中声明了一个全局变量,并在source.cpp和main.cpp中包含了该头,但是链接器给出了错误
Source.obj : error LNK2005: "int globalVariable" (?globalVariable@@3HA) already defined in Main.obj
GlobalVariableAndLinkageIssue.exe fatal error LNK1169: one or more multiply defined symbols found
int globalVariable;
#include "header.h"
#include"header.h"
void main() {}
答案 0 :(得分:3)
将声明移动到.cpp文件。您可以使用以下命令在头文件中使用声明:
extern int globalVariable; // declaration in header - can have as many as you need
但是.cpp文件应该有定义:
int globalVariable; // definition in .cpp - only need one across all your files
C和C ++使用文本预处理器来包含标题,这基本上是文本插入,而不是某些语言中的智能模块系统。通过按原样包含它,您将创建多个定义,每个.cpp文件一个。
作为一种良好实践,您需要习惯使用包含保护来防止多个嵌套包含(尽管它不能解决您当前的问题)。如果使用Visual C ++,您可以使用#pragma once
或使用便携式解决方案将标题代码包装在:
#ifndef _INCLUDE_FOO_H_
#endif
答案 1 :(得分:1)
要创建全局变量,您应该执行以下操作。请注意,在标题中,我们将变量标记为extern
,我们实际上在cpp
文件中创建了对象。
extern int globalVariable;
#include "header.h"
int globalVariable;
#include "header.h"
int main() {}
答案 2 :(得分:0)
因为两个来源#include你的标题,因此它被定义了两次。
答案 3 :(得分:0)
将全局变量放在某个.c或.cpp文件中,这样它只能定义一次并使用extern在头文件中引用 例如,
<强> header.h 强>
extern int globalVariable;
<强> header.cpp 强>
int globalVariable = 0;
<强> source.cpp 强>
#include "header.h"
<强>的main.cpp 强>
#include"header.h"
int main() {
return 0;
}
答案 4 :(得分:-2)
在这种情况下,通常使用一些#define如下:
//header.h
#ifdef DEFINE_VARS
#define DEFINE_OR_DECLARE
#else
#define DEFINE_OR_DECLARE extern
#endif
DEFINE_OR_DECLARE int globalVariable;
//main.cpp
#define DEFINE_VARS
#include "header.h"
...
//header.cpp
#include "header.h"
...