LNK2005是一个重复定义错误,造成LNK2005主要有以下几种情况:
目录
全局变量的重复定义
全局变量可能存在两种情况:
情况A:全局变量在.cpp文件中的多次声明
我们首先在一个cpp用到了一个全局变量a(10),会定义如下:
int a = 10;
在其他的cpp文件中继续使用该变量只需要声明:
extern int a;
如果我们需要在另一个cpp文件中使用int a,那么就会产生LNK2005错误。
此时,在其他cpp文件声明的时候不要给变量赋值(赋值就成了定义),否则还是会有LNK2005的错误。
extern int a = 10;
根据C++标准,一个变量是声明,必须同时满足两个条件,否则就是定义:
- 声明必须使用extern关键字
- 不能给变量赋初值
所以,下面的是声明:
extern int a;
下面的是定义:
int a;
int a = 0;
extern int a =0;
情况B:变量名重复
对于粗心的我来说,总是在需要使用变量的cpp文件中随意定义一个全局变量 int a =0;,在下一个文件中又无意用到了一个新的a “int a = 0”,这造成了变量名重复的LNK2005错误。
头文件的包含重复
一般,头文件含有变量、函数、类的定义。
重复引用头文件,那么就会产生LNK2005错误。
解决方案
#ifndef标识符宏定义
在需要包含的头文件中做类似的处理:
#ifndef MY_H_FILE
//如果没有定义这个宏
#define MY_H_FILE
//定义这个宏
//...code...头文件主体内容
//...code...
endif