C程序中關(guān)于c和h的包含問題
這次如果還是按照上面的方法只編譯main.c的話就會出錯,因為變量c和函數(shù)sun并沒有在main.c中定義,所以編譯時需要將fun.c一起編譯:
編譯命令:
編譯命令:
gcc -c main.c -o main.o #編譯main.c
gcc -c fun.c -o fun.o#編譯fun.c
gcc main.o fun.o -o main#用main.o fun.o生成main
到這里大家應(yīng)該已經(jīng)理解包含.c文件和多文件程序的本質(zhì)區(qū)別了~~~
gcc -c fun.c -o fun.o#編譯fun.c
gcc main.o fun.o -o main#用main.o fun.o生成main
到這里大家應(yīng)該已經(jīng)理解包含.c文件和多文件程序的本質(zhì)區(qū)別了~~~
好了,大家不防想想這兩種方法的優(yōu)缺點,這里就只寫不足之處了:
1. 包含.c文件的方法: 容易產(chǎn)生"重定義",大家想想如果一個工程中有多個文件都同時包含了某一個件,那么這個被包含文件的內(nèi)容就會被復(fù)制到多個文件中去,也就相當(dāng)于每個包含該文件的文件中都定義被包含文件中的變量和函數(shù),這樣在鏈接時就會產(chǎn)生"重定義"錯誤。
1. 包含.c文件的方法: 容易產(chǎn)生"重定義",大家想想如果一個工程中有多個文件都同時包含了某一個件,那么這個被包含文件的內(nèi)容就會被復(fù)制到多個文件中去,也就相當(dāng)于每個包含該文件的文件中都定義被包含文件中的變量和函數(shù),這樣在鏈接時就會產(chǎn)生"重定義"錯誤。
2. 多文件分開編譯的方法: 這個比較好,不容易出現(xiàn)"重定義"之類的問題,這也是我們最常用的一種方法,但是并不是像上面這個例子中這樣直接去用,而是使用"頭文件"將各個.c文件聯(lián)系起來。
上邊這個例子大家會發(fā)現(xiàn),在main.c中需要加上“extern int c;”這樣一句聲明,如果包含的文件較多?如果全局變量較多?...這個我們可以省掉嗎?回答是肯定的!方法就是給它寫上一個頭文件。
上邊這個例子大家會發(fā)現(xiàn),在main.c中需要加上“extern int c;”這樣一句聲明,如果包含的文件較多?如果全局變量較多?...這個我們可以省掉嗎?回答是肯定的!方法就是給它寫上一個頭文件。
接下來看一下使用頭文件的來實現(xiàn)這個例子的方法:
1://file1: main.c
2:#include
3:#include"fun.h"http://fun.c修改為fun.h
4://extern int c; //這行也不要了
5:intmain()
6:{
7:inta=5,b=19;
8:c = a;
9:sun(a,b);
10:printf("c=%d",c);
11:return0;
12:}
13://end of file1
1:
2://file2: fun.c
3:#include"fun.h"
4:intc=0;//變量c的定義
5:voidsun(inta,intb)//函數(shù)sun()的定義
6:{
7:printf("a+b=%d",a+b);
8:c=0;
9:printf("c=%d",c);
10:}
11://end of file2
1://file3: fun.h
2:externintc;//把c聲明為外部可用的
3:voidsun(inta,intb);//sun()函數(shù)的聲明
4://end of file3
這樣再看一下,在要用到fun.c中定義的函數(shù)或變量的文件中只要包含fun.h文件就可以了,是不是這樣???呵呵,當(dāng)然是了。。。
預(yù)處理時會把fun.h中的內(nèi)容復(fù)制到包含它的文件中去,而復(fù)制的這些內(nèi)容只是聲名,不是定義,所以它被復(fù)制再多份也不會出現(xiàn)"重定義"的錯誤。。。
呵呵,對,就是這樣,這就是頭文件給我們再來的好處。
預(yù)處理時會把fun.h中的內(nèi)容復(fù)制到包含它的文件中去,而復(fù)制的這些內(nèi)容只是聲名,不是定義,所以它被復(fù)制再多份也不會出現(xiàn)"重定義"的錯誤。。。
呵呵,對,就是這樣,這就是頭文件給我們再來的好處。
前面說了頭文件的方法也是模塊化程序設(shè)計中的一種非常有利的手段。
把同一類功能寫到一個.c文件中,這樣可以把他們劃為一個模塊,另外再對應(yīng)的寫上一個.h文件做它的聲明。這樣以后再使用這個模塊時只需要把這兩個文件添加進工程,同時在要使用模塊內(nèi)函數(shù)或變量的文件中包含.h文件就可以了。
把同一類功能寫到一個.c文件中,這樣可以把他們劃為一個模塊,另外再對應(yīng)的寫上一個.h文件做它的聲明。這樣以后再使用這個模塊時只需要把這兩個文件添加進工程,同時在要使用模塊內(nèi)函數(shù)或變量的文件中包含.h文件就可以了。
舉個很實際的例子,在單片機、ARM或其他嵌入式開發(fā)中,每一個平臺可能本身都有多種不同的硬件模塊,使用時需要去寫相應(yīng)的驅(qū)動程序,這樣就可以把各個硬件模塊的驅(qū)動程序作為一個模塊(比如lcd驅(qū)動對對應(yīng)lcd.c和lcd.h,IIC驅(qū)動對應(yīng)I2C.c和I2C.h等),當(dāng)具體使用到某個模塊時,只需要在將對應(yīng)的.c和.h文件添加進工程,并在文件中包含對就的.h文件即可。
關(guān)鍵詞:
C程序包含問
評論