分享

补习C语言之在.h文件中定义全局变量

 clhon 2011-05-24

      话说在一次整理code的时候,无意间将一个原本定义在.c文件中的全局变量移动到.h 文件中(此全局变量被多个.c文件使用),然后突然不能生成.ko(linux中可动态装载的驱动模块).怎么回事?难道是移动code的时候弄错了?仔细一看提示信息,原来是 multiple definition.没整理之前的code是将此全局变量定义在file***.c 中, 然后在其他的.c中使用的是extern 导入,当时可以很顺利的编成.ko.后来由于感觉code不美观,在整理code的时候把它提到了file***.h中,让使用到这个全局变量的.c都 include file***.h(貌似这样做不是很好?暂时不管了).怎么就这么简单移动了一下code,就会出现问题?(有段时间没写 C  code了,^_^...).

     于是乎,开始写一个简单的测试code来找原因. 下面的几段估计全世界的会玩电脑的人都能看懂的code. 先贴上:

//file1.h

#ifndef __FILE1_H__
#define __FILE1_H__

int i;

#endif

//file2.h

#ifndef __FILE2_H__
#define __FILE2_H__

#include "file1.h"

extern void file2_change_i_value(void);

#endif

//file1.c

#include "file1.h"
#include "file2.h"

void main(void)
{
    printf("before i = %d\n", i);
    file2_change_i_value();
    printf("after i = %d\n", i);
}

//file2.c

#include "file2.h"

void file2_change_i_value(void)
{
     i = 10;
}

      我使用的是linux平台,所以使用 gcc file1.c file2.c -o file  编译生成可执行文件file. 嗯??这次居然很顺利的生成了file.赶紧执行 ./file, console 打印出如下信息:

before i = 0
after i = 10

      回头看看gcc 编译过程中有没有类似 multiple definition 的error 或 warning 信息,很遗憾,居然也没有.难道是现在写的这个小code没有模拟出上面生成.ko文件的原始code. 一想,还确实有点不一样的地方,于是乎,把上面的code修改为如下,只需要修改file1.h文件哦.

//file1.h

#ifndef __FILE1_H__
#define __FILE1_H__

int i = 0;

#endif


      然后执行 gcc file1.c file2.c -o file , 哈哈,这次就出现 multiple definition of `i' 的提示了.

     现在我们来比较一下2次 file1.h 的区别, 很显然, 第一次没有对 i 赋初值, 而第二次 赋初值为 0. 嗯? 好像int全局变量初始值都是0吧,想想,学习C语言到现在都第8个年头,书本的知识早也忘记得差不多了.言归正传,那既然全局变量 i 2次的的值都是一样的,为什么会出现这样的提示呢?哦,对了,好像有一次, 也是在一个.c文件中定义了一个全局变量并赋初值,然后直接把定义语句copy到了其他使用它的其他.c文件中,在前面加了一个 extern, 编译也是 failed. 这2 中现象是不是很相似??

      看看C语言课本,自己的理解是,貌似在定义的时候可以赋初值,声明的时候不用赋值,只需要extern一下就OK.至于在.h中定义全局变量,大致也是说,这样做的话,多个.c文件在 include .h以后,会当作又重新定义变量,然后全局变量的命名污染了,就提示 multiple definition 了. 我个人觉得是这样,如有不够完整或有异义的地方大家可以留言指点.....

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多