关于重复定义 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库等。当出现重复定义时,可以将提示出错的库放在另一个库前边。可以的话不只使用其中一个库。

原文地址:https://www.cnblogs.com/ice-arrow/p/12161653.html