关于重复定义 LNK2005
有时候会见到同事写的代码中,头文件一打开就有如下格式:
#ifndef ...
#define ...
...//正文
#endif
当时看不出有什么意义,于是也就不明白为什么这么写了,就这样让它做为一个高端的存在放在记忆里
今天它从神坛上掉了下来:
原来它是意义仅仅是替换 #pragma once,然而头文件中都包含此句 -_-” OMG
这样可以避免头文件被重复包含,并被重复编译,于是也可以避免头文件中可能存在的全局变量被重复定义。
以下几种情形与全局变量重复定义有关:
1.因为全局变量是针对整个工程的,正确的:在一个CPP文件中定义,eg. int g_Test;在另一个要使用的CPP中声明:extern int g_Test。
但是如果还是 int g_Test就会LNK2005了。
划重点,C++标准的规定,变量是声明必须满足以下两个条件,否则就是定义:
(1)声明必须使用extern关键字;
(2)不能给变量赋初值;
所以
int a; int a = 0; extern int a =0; 是定义
extern int a; 是声明
2.当头文件中声明了全局变量时,必段使用#pragma once 来避免重复定义,也可以使用上边提到的宏定议方式
3.当使用第三方库出现重定义时,例如MFC库与C运行库,以及MFC与ATL库等。当出现重复定义时,可以将提示出错的库放在另一个库前边。可以的话不只使用其中一个库。