在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

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

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

            作者: 時(shí)間:2016-12-01 來(lái)源:網(wǎng)絡(luò) 收藏
            這次如果還是按照上面的方法只編譯main.c的話就會(huì)出錯(cuò),因?yàn)樽兞縞和函數(shù)sun并沒(méi)有在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),這里就只寫(xiě)不足之處了:
            1. 包含.c文件的方法: 容易產(chǎn)生"重定義",大家想想如果一個(gè)工程中有多個(gè)文件都同時(shí)包含了某一個(gè)件,那么這個(gè)被包含文件的內(nèi)容就會(huì)被復(fù)制到多個(gè)文件中去,也就相當(dāng)于每個(gè)包含該文件的文件中都定義被包含文件中的變量和函數(shù),這樣在鏈接時(shí)就會(huì)產(chǎn)生"重定義"錯(cuò)誤。
            2. 多文件分開(kāi)編譯的方法: 這個(gè)比較好,不容易出現(xiàn)"重定義"之類的問(wèn)題,這也是我們最常用的一種方法,但是并不是像上面這個(gè)例子中這樣直接去用,而是使用"頭文件"將各個(gè).c文件聯(lián)系起來(lái)。
            上邊這個(gè)例子大家會(huì)發(fā)現(xiàn),在main.c中需要加上“extern int c;”這樣一句聲明,如果包含的文件較多?如果全局變量較多?...這個(gè)我們可以省掉嗎?回答是肯定的!方法就是給它寫(xiě)上一個(gè)頭文件。
            接下來(lái)看一下使用頭文件的來(lái)實(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è)賮?lái)的好處。
            前面說(shuō)了頭文件的方法也是模塊化程序設(shè)計(jì)中的一種非常有利的手段。

            把同一類功能寫(xiě)到一個(gè).c文件中,這樣可以把他們劃為一個(gè)模塊,另外再對(duì)應(yīng)的寫(xiě)上一個(gè).h文件做它的聲明。這樣以后再使用這個(gè)模塊時(shí)只需要把這兩個(gè)文件添加進(jìn)工程,同時(shí)在要使用模塊內(nèi)函數(shù)或變量的文件中包含.h文件就可以了。
            舉個(gè)很實(shí)際的例子,在單片機(jī)、ARM或其他嵌入式開(kāi)發(fā)中,每一個(gè)平臺(tái)可能本身都有多種不同的硬件模塊,使用時(shí)需要去寫(xiě)相應(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文件即可。
            上一頁(yè) 1 2 下一頁(yè)

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

            評(píng)論


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

            關(guān)閉