話說在一次整理code的時(shí)候,無意間將一個原本定義在.c文件中的全局變量移動到.h 文件中(此全局變量被多個.c文件使用),然后突然不能生成.ko(linux中可動態(tài)裝載的驅(qū)動模塊).怎么回事?難道是移動code的時(shí)候弄錯了?仔細(xì)一看提示信息,原來是 multiple definition.沒整理之前的code是將此全局變量定義在file***.c 中, 然后在其他的.c中使用的是extern 導(dǎo)入,當(dāng)時(shí)可以很順利的編成.ko.后來由于感覺code不美觀,在整理code的時(shí)候把它提到了file***.h中,讓使用到這個全局變量的.c都 include file***.h(貌似這樣做不是很好?暫時(shí)不管了).怎么就這么簡單移動了一下code,就會出現(xiàn)問題?(有段時(shí)間沒寫 C code了,^_^...).
于是乎,開始寫一個簡單的測試code來找原因. 下面的幾段估計(jì)全世界的會玩電腦的人都能看懂的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 編譯生成可執(zhí)行文件file. 嗯??這次居然很順利的生成了file.趕緊執(zhí)行 ./file, console 打印出如下信息:
before i = 0
after i = 10
回頭看看gcc 編譯過程中有沒有類似 multiple definition 的error 或 warning 信息,很遺憾,居然也沒有.難道是現(xiàn)在寫的這個小code沒有模擬出上面生成.ko文件的原始code. 一想,還確實(shí)有點(diǎn)不一樣的地方,于是乎,把上面的code修改為如下,只需要修改file1.h文件哦.
//file1.h
#ifndef __FILE1_H__
#define __FILE1_H__
int i = 0;
#endif
然后執(zhí)行 gcc file1.c file2.c -o file , 哈哈,這次就出現(xiàn) multiple definition of `i' 的提示了.
現(xiàn)在我們來比較一下2次 file1.h 的區(qū)別, 很顯然, 第一次沒有對 i 賦初值, 而第二次 賦初值為 0. 嗯? 好像int全局變量初始值都是0吧,想想,學(xué)習(xí)C語言到現(xiàn)在都第8個年頭,書本的知識早也忘記得差不多了.言歸正傳,那既然全局變量 i 2次的的值都是一樣的,為什么會出現(xiàn)這樣的提示呢?哦,對了,好像有一次, 也是在一個.c文件中定義了一個全局變量并賦初值,然后直接把定義語句copy到了其他使用它的其他.c文件中,在前面加了一個 extern, 編譯也是 failed. 這2 中現(xiàn)象是不是很相似??
看看C語言課本,自己的理解是,貌似在定義的時(shí)候可以賦初值,聲明的時(shí)候不用賦值,只需要extern一下就OK.至于在.h中定義全局變量,大致也是說,這樣做的話,多個.c文件在 include .h以后,會當(dāng)作又重新定義變量,然后全局變量的命名污染了,就提示 multiple definition 了. 我個人覺得是這樣,如有不夠完整或有異義的地方大家可以留言指點(diǎn).....