新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > C程序中關(guān)于c和h的包含問題

        C程序中關(guān)于c和h的包含問題

        作者: 時(shí)間:2016-12-01 來源:網(wǎng)絡(luò) 收藏
        這次如果還是按照上面的方法只編譯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ū)別了~~~
        好了,大家不防想想這兩種方法的優(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ò)誤。
        2. 多文件分開編譯的方法: 這個(gè)比較好,不容易出現(xiàn)"重定義"之類的問題,這也是我們最常用的一種方法,但是并不是像上面這個(gè)例子中這樣直接去用,而是使用"頭文件"將各個(gè).c文件聯(lián)系起來。
        上邊這個(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>
        前面說了頭文件的方法也是模塊化程序設(shè)計(jì)中的一種非常有利的手段。

        把同一類功能寫到一個(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文件即可。
        上一頁 1 2 下一頁

        關(guān)鍵詞: C程序包含問

        評(píng)論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 洪洞县| 醴陵市| 大理市| 靖州| 宜川县| 昌邑市| 黄陵县| 松江区| 大田县| 雷波县| 龙里县| 乐亭县| 出国| 大连市| 阿尔山市| 洪江市| 金华市| 长丰县| 海伦市| 台东县| 渭源县| 罗山县| 海盐县| 囊谦县| 广丰县| 兴和县| 望谟县| 辽阳市| 岑溪市| 安国市| 聊城市| 高陵县| 永年县| 新乡市| 萨嘎县| 广南县| 大竹县| 永德县| 越西县| 麟游县| 乃东县|