补习C语言之在.h文件中定义全局变量
2010-09-28 15:01
471 查看
话说在一次整理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 了. 我个人觉得是这样,如有不够完整或有异义的地方大家可以留言指点.....
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 了. 我个人觉得是这样,如有不够完整或有异义的地方大家可以留言指点.....
相关文章推荐
- 详解keil采用C语言模块化编程时全局变量、结构体的定义、声明以及头文件包含的处理方法!
- 详解keil采用C语言模块化编程时全局变量、结构体的定义、声明以及头文件包含的处理方法!
- [C语言]防止头文件和全局变量重复定义
- keil 中——C语言模块化编程时全局变量、结构体的定义、声明以及头文件包含的处理方法
- [C语言]防止头文件和全局变量重复定义
- 详解keil采用C语言模块化编程时全局变量、结构体的定义、声明以及头文件包含的处理方法
- [C语言项目]防止头文件和全局变量重复定义
- 每日一题(31)—— 全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?
- C++如何定义多个文件使用全局变量
- 头文件定义全局变量的几个问题
- 如何引用一个已经定义过的全局变量 与 全局变量可不可以定义在可被多个.C文件包含的头文件中
- C语言:全局变量在多个 c 文件中公用的方法
- 全局变量可不可以定义在可被多个.C文件包含的头文件中?
- C语言如何在两个文件中访问同一个全局变量
- C语言全局变量定义方法
- 能不能在头文件中定义全局变量?
- C语言全局变量多文件使用
- 关于头文件中定义的全局变量的包含
- C/C++语言在头文件中定义全局变量
- C语言中定义全局变量要注意的地方