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ù)制到多個文件中去,也就相當于每個包含該文件的文件中都定義被包含文件中的變量和函數(shù),這樣在鏈接時就會產(chǎn)生"重定義"錯誤。
1. 包含.c文件的方法: 容易產(chǎn)生"重定義",大家想想如果一個工程中有多個文件都同時包含了某一個件,那么這個被包含文件的內(nèi)容就會被復(fù)制到多個文件中去,也就相當于每個包含該文件的文件中都定義被包含文件中的變量和函數(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文件就可以了,是不是這樣???呵呵,當然是了。。。
預(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等),當具體使用到某個模塊時,只需要在將對應(yīng)的.c和.h文件添加進工程,并在文件中包含對就的.h文件即可。
關(guān)鍵詞:
C程序包含問
評論