首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

对于在头文件中定义全局变量的纳闷

2012-12-31 
对于在头文件中定义全局变量的疑惑本帖最后由 xiaodaogo 于 2012-07-14 15:25:36 编辑一般的说法是定义全

对于在头文件中定义全局变量的疑惑
本帖最后由 xiaodaogo 于 2012-07-14 15:25:36 编辑 一般的说法是定义全局变量是在C文件里定义,在头文件中extern声明,然后供要用到该变量的其它C文件直接INCLUDE有声明的头文件即可。
如果是直接在头文件中定义全局变量那么INCLUDE这个头文件的其它C文件在编译后产生多份,但我做了个实验结果和说的不是一回事,请大家解惑~

定义全局变量的头文件 aaa.h

char *strBuffer;

--------------------------------------------
另一个使用全局变量的 bbb.h 和 bbb.c
bbb.h
#include "aaa.h"
void concat();


bbb.c
#include "bbb.h"
#include <string.h>
void concat()
{
  strcat(strBuffer,"123456");
}


----------------------------------
测试C文件,test.c

#include "aaa.h"
#include "bbb.h"
int main(int argc,char **argv)
{
char temp[20];
memset(temp,0,sizeof(temp));
strBuffer = temp;

strcpy(strBuffer,"aabbcc");
concat();

printf("==[%s]\n",strBuffer);
return 0;
}


执行后的打印结果 : ==[aabbcc123456]

通过上面的试验发现不同的C文件里INCLUDE同一个头文件,里面定义的全局变量却是公用的,也没有报重复定义的错。用的编译器是VC6,两个C文件也编译出了不同的OBJ文件,按说应该是每个OBJ里都有strBuffer的定义的,难道是在最后LINK的时候把两个变量合并成一个了么,如果是合并岂不是还要重定位变量的地址,总之和网上查到的说法不一致,希望能在这里找到答案
[解决办法]
char *strBuffer;的确只是声明,而非定义。

定义时要分配内存的,比如:char *strBuffer = (char*)malloc(sizeof(char) * 100);

全局变量只能在一处定义,但可以在多出声明,在别的文件里面声明的时候,就需要加上extern这个关键字,表明已经在别的地方定义过了(分配过内存了)。
[解决办法]
我开始以为这不可能
但实际试了一下,居然确实没问题。

应该是链接器对此宽容了。
从反汇编来看,链接器按照链接的顺序,使用了第一个见到的变量
楼主这个,应该是不影响的
但,如果是定义了全局数组,而其大小不同,又或者,不同类型,却同名
估计就悲剧了。

为什么不检查?
难以理解
颠覆了我对C的认知了。。。

热点排行