在MFC中,有时需要多个类之间传递信息,一个共通的头文件是个不错的选择。如果在头文件中直接声明一个变量的话,势必会报出一个错误:
error LNK2005: "struct my_global global_data" (?global_data@@3Umy_global@@A) already defined in MFCApplication1Dlg.obj
不对呀,我明明是在头文件声明的,不同的文件中的变量应该是同一个啊,怎么还重定义了呢?
反复查证之后,原来是自己对头文件的理解一直有错误。
引用一篇好文:http://www.oschina.net/question/253403_44866?sort=time
摘要部分如下:
“楼主的问题,是对头文件作用不太了解造成了。头文件本质只是个文本。连源文件都算不上。有些编译器会对.h文件做写特殊化的处理。
但是希望你理解,.h头 文件自身没有意义,有意义的是#include ,你参考我下面的一个代码例子,不知道你是否能理解,我用C写的,
C++也基本一样,在使用 #include方面。”
//这是一个很简单的程序,就一个main.c函数 #include <stdio.h> int main(int argc ,char *argv[]){ printf("hello world! "); return 0; } //我把上面修改一下,新生成两个文本文件,printf_hello_world.txt ,return.txt //printf_hello_world.txt里面的内容就一行 printf("hello world! "); //return.txt里面的内容也就一行 return 0; //同时修改main.c文件如下 #include <stdio.h> int main(int argc ,char *argv[]){ #include "printf_hello.world.txt" #include "return.txt" }
"你可以发现,修改后的代码和原始代码运行是一个结果。准确说,对编译器而言,是完全一样的内容。
#include只是将后面的文件,插入到当前的文本中。其实和.h无关。
而你将一个函数写在.h里面当多个文件均#include时,则这个函数对于多个文件,再编译器看来,每个文件都存在完全相同的函数
(只要函数定义 相同就会有冲突)。而C语言或C++,默认对每个函数是可作为外部函数的。此时,连接器就会混乱。究竟连接哪
个文本(源文件)所编译对应的函数。
你可以把函数写在头文件里,但需要增加static 前缀。此时这个函数就会在每个#include该头文件的源文件中存在,由于是static,
对于函数是局部的意思,此时,外部就无法 调用到该函数,最多会出现”找不到该函数的连接错误“而不会说函数重复存在的问题。"
自然,如果我在头文件中声明变量直接引用的话,就会造成变量重定义的错误。那么该如何正确使用头文件呢?对于函数,我们使用static,对于变量,我们则使用extern。
具体方法如下:
在头文件中,添加extern变量:
extern my_global global_data;
在主对话框中,再次声明该变量:
my_global global_data;
那么在所有文件中,只要引入头文件,就可以调用该变量了。
extern的使用是一个基础知识,搞得我昏头昏脑,很是惭愧= = 头文件的正确打开方式则是个意外收获,曰:nice。