C程序中關(guān)于c和h的包含問題
這次如果還是按照上面的方法只編譯main.c的話就會(huì)出錯(cuò),因?yàn)樽兞縞和函數(shù)sun并沒有在main.c中定義,所以編譯時(shí)需要將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)缺點(diǎn),這里就只寫不足之處了:
1. 包含.c文件的方法: 容易產(chǎn)生"重定義",大家想想如果一個(gè)工程中有多個(gè)文件都同時(shí)包含了某一個(gè)件,那么這個(gè)被包含文件的內(nèi)容就會(huì)被復(fù)制到多個(gè)文件中去,也就相當(dāng)于每個(gè)包含該文件的文件中都定義被包含文件中的變量和函數(shù),這樣在鏈接時(shí)就會(huì)產(chǎn)生"重定義"錯(cuò)誤。
1. 包含.c文件的方法: 容易產(chǎn)生"重定義",大家想想如果一個(gè)工程中有多個(gè)文件都同時(shí)包含了某一個(gè)件,那么這個(gè)被包含文件的內(nèi)容就會(huì)被復(fù)制到多個(gè)文件中去,也就相當(dāng)于每個(gè)包含該文件的文件中都定義被包含文件中的變量和函數(shù),這樣在鏈接時(shí)就會(huì)產(chǎn)生"重定義"錯(cuò)誤。
2. 多文件分開編譯的方法: 這個(gè)比較好,不容易出現(xiàn)"重定義"之類的問題,這也是我們最常用的一種方法,但是并不是像上面這個(gè)例子中這樣直接去用,而是使用"頭文件"將各個(gè).c文件聯(lián)系起來。
上邊這個(gè)例子大家會(huì)發(fā)現(xiàn),在main.c中需要加上“extern int c;”這樣一句聲明,如果包含的文件較多?如果全局變量較多?...這個(gè)我們可以省掉嗎?回答是肯定的!方法就是給它寫上一個(gè)頭文件。
上邊這個(gè)例子大家會(huì)發(fā)現(xiàn),在main.c中需要加上“extern int c;”這樣一句聲明,如果包含的文件較多?如果全局變量較多?...這個(gè)我們可以省掉嗎?回答是肯定的!方法就是給它寫上一個(gè)頭文件。
接下來看一下使用頭文件的來實(shí)現(xiàn)這個(gè)例子的方法:
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ù)處理時(shí)會(huì)把fun.h中的內(nèi)容復(fù)制到包含它的文件中去,而復(fù)制的這些內(nèi)容只是聲名,不是定義,所以它被復(fù)制再多份也不會(huì)出現(xiàn)"重定義"的錯(cuò)誤。。。
呵呵,對(duì),就是這樣,這就是頭文件給我們?cè)賮淼暮锰帯?div>
預(yù)處理時(shí)會(huì)把fun.h中的內(nèi)容復(fù)制到包含它的文件中去,而復(fù)制的這些內(nèi)容只是聲名,不是定義,所以它被復(fù)制再多份也不會(huì)出現(xiàn)"重定義"的錯(cuò)誤。。。
呵呵,對(duì),就是這樣,這就是頭文件給我們?cè)賮淼暮锰帯?div>
前面說了頭文件的方法也是模塊化程序設(shè)計(jì)中的一種非常有利的手段。
把同一類功能寫到一個(gè).c文件中,這樣可以把他們劃為一個(gè)模塊,另外再對(duì)應(yīng)的寫上一個(gè).h文件做它的聲明。這樣以后再使用這個(gè)模塊時(shí)只需要把這兩個(gè)文件添加進(jìn)工程,同時(shí)在要使用模塊內(nèi)函數(shù)或變量的文件中包含.h文件就可以了。
把同一類功能寫到一個(gè).c文件中,這樣可以把他們劃為一個(gè)模塊,另外再對(duì)應(yīng)的寫上一個(gè).h文件做它的聲明。這樣以后再使用這個(gè)模塊時(shí)只需要把這兩個(gè)文件添加進(jìn)工程,同時(shí)在要使用模塊內(nèi)函數(shù)或變量的文件中包含.h文件就可以了。
舉個(gè)很實(shí)際的例子,在單片機(jī)、ARM或其他嵌入式開發(fā)中,每一個(gè)平臺(tái)可能本身都有多種不同的硬件模塊,使用時(shí)需要去寫相應(yīng)的驅(qū)動(dòng)程序,這樣就可以把各個(gè)硬件模塊的驅(qū)動(dòng)程序作為一個(gè)模塊(比如lcd驅(qū)動(dòng)對(duì)對(duì)應(yīng)lcd.c和lcd.h,IIC驅(qū)動(dòng)對(duì)應(yīng)I2C.c和I2C.h等),當(dāng)具體使用到某個(gè)模塊時(shí),只需要在將對(duì)應(yīng)的.c和.h文件添加進(jìn)工程,并在文件中包含對(duì)就的.h文件即可。
關(guān)鍵詞:
C程序包含問
相關(guān)推薦
技術(shù)專區(qū)
- FPGA
- DSP
- MCU
- 示波器
- 步進(jìn)電機(jī)
- Zigbee
- LabVIEW
- Arduino
- RFID
- NFC
- STM32
- Protel
- GPS
- MSP430
- Multisim
- 濾波器
- CAN總線
- 開關(guān)電源
- 單片機(jī)
- PCB
- USB
- ARM
- CPLD
- 連接器
- MEMS
- CMOS
- MIPS
- EMC
- EDA
- ROM
- 陀螺儀
- VHDL
- 比較器
- Verilog
- 穩(wěn)壓電源
- RAM
- AVR
- 傳感器
- 可控硅
- IGBT
- 嵌入式開發(fā)
- 逆變器
- Quartus
- RS-232
- Cyclone
- 電位器
- 電機(jī)控制
- 藍(lán)牙
- PLC
- PWM
- 汽車電子
- 轉(zhuǎn)換器
- 電源管理
- 信號(hào)放大器
評(píng)論