為什么C語(yǔ)言頭文件中要用條件編譯?
為什么C語(yǔ)言頭文件中要用條件編譯?
因?yàn)?你用的和你看到的頭文件是為開(kāi)發(fā)者方便服務(wù)的,不是為你服務(wù)的。 有了條件編譯,開(kāi)發(fā)人員可以很方便的為多種情形(比如不同硬件環(huán)境,不同軟件環(huán)境)維護(hù)一套代碼。
發(fā)布時(shí)原樣發(fā)布出來(lái)就是你看到的樣子。
你的使用條件和使用環(huán)境確定的話,可以去掉條件編譯的,只是需要花時(shí)間精力,沒(méi)人去干而已。可以下載嘗試下中文版的C語(yǔ)言:習(xí)語(yǔ)言, 頭文件里很少條件編譯。
關(guān)于c語(yǔ)言頭文件編譯和運(yùn)行的問(wèn)題
1、只要在程序開(kāi)頭加入#include<頭文件名>,在編譯過(guò)程當(dāng)中,頭文件自動(dòng)會(huì)被添加到源文件當(dāng)中一起進(jìn)行編譯。2、編譯,編譯程序讀取源程序(字符流),對(duì)之進(jìn)行詞法和語(yǔ)法的分析,將高級(jí)語(yǔ)言指令轉(zhuǎn)換為功能等效的匯編代碼,再由匯編程序轉(zhuǎn)換為機(jī)器語(yǔ)言,并且按照操作系統(tǒng)對(duì)可執(zhí)行文件格式的要求鏈接生成可執(zhí)行程序。
C源程序頭文件-->預(yù)編譯處理(cpp)-->編譯程序本身-->優(yōu)化程序-->匯編程序-->鏈接程序–>可執(zhí)行文件。
請(qǐng)問(wèn)一下,c++中頭文件被include一次就要被編譯一次嗎? 謝謝
基本上是這樣:頭文件在編譯初期就會(huì)被加入到引用它的cpp文件中去,c++工程的編譯單位是單個(gè)cpp文件,編譯器先把這些文件編譯成為.o文件,然后在鏈接在一起,所以相當(dāng)于include一次編譯一次。
為什么在頭文件里面用條件編譯呢?程序如下
#define指示接受一個(gè)名字并定義該名字為預(yù)處理器變量。#ifndef指示檢測(cè)指定的預(yù)處理變量是否未定義。
如果預(yù)處理器變量未定義,那么跟在其后的所有指示都被處理,直到出現(xiàn)#endif。
可以用這些設(shè)施來(lái)預(yù)防多次包含同一頭文件。你的例子是測(cè)試LCDHEARD宏是否被定義,如果未定義就定義那個(gè)宏,同時(shí)#include <forlcd.h>// 液晶驅(qū)動(dòng)程序#include <changdata.h>//宏定義文件為什么要避免頭文件被重復(fù)包含?因?yàn)?include是直接將頭文件的內(nèi)容取代#include所在行,所以如果頭文件重復(fù)包含的話,代碼量將相當(dāng)龐大,編譯效率下降。
C++調(diào)用類(lèi)頭文件為什么只需要include聲明部分而不需要類(lèi)的定義部分
你這個(gè)問(wèn)題問(wèn)得好。這牽扯到C++語(yǔ)言從編寫(xiě)–>執(zhí)行整個(gè)過(guò)程。
一般來(lái)講,開(kāi)發(fā)一個(gè)C++程序需要經(jīng)過(guò)以下幾步1. 編寫(xiě)代碼,2. 編譯器進(jìn)行編譯,compile3. 編譯器進(jìn)行連接。
4. 執(zhí)行。由于C++語(yǔ)言支持多文件工程。需要經(jīng)過(guò)編譯和連接的過(guò)程。打個(gè)比方,你要建造一架飛機(jī),需要發(fā)動(dòng)機(jī),機(jī)翼,機(jī)身,尾翼,起落架。
你可以把這幾個(gè)部分交給專(zhuān)門(mén)的廠商去制作,這就是編譯過(guò)程。這么多零件交給你,你只需要組裝起來(lái)就可以了,這就是連接過(guò)程。編譯器(比如VC)就是加工零件的工廠,通過(guò)編譯器的源代碼會(huì)變成目標(biāo)文件,也就是零件,VC生成的是.obj文件。
連接器百科(比如VC下的link)就是組裝工廠,它能把所有的零件組裝成你需要的東西。好了,搞懂了編譯器和連接器,我們?cè)賮?lái)看頭文件.h和實(shí)現(xiàn)文件.cpp的作用。還是拿飛機(jī)舉例子。
機(jī)身和機(jī)翼是必須連接起來(lái)的,但是他們之間怎么連接呢?制作機(jī)翼的只會(huì)做機(jī)翼,制作機(jī)身的也只會(huì)制作機(jī)身。那么作為組裝工廠的你就會(huì)提供給他們一份飛機(jī)的接口設(shè)計(jì)圖,圖紙里面詳細(xì)描述了機(jī)翼和機(jī)身怎么連接,但并不描述機(jī)翼和機(jī)身應(yīng)該怎么去制作。那些零件工廠拿到結(jié)構(gòu)圖紙以后,就知道了,原來(lái)機(jī)翼是被安放在機(jī)身的這個(gè)地方,嗯,而且規(guī)定了用鉚釘(打個(gè)比方)連接。
好了,我知道了??梢宰隽耍鳛闄C(jī)翼制造商,我不用關(guān)心機(jī)身是怎么做的,我只關(guān)心機(jī)翼的制作和與機(jī)身的接口。換到C++這邊來(lái),這個(gè)用來(lái)描述接口的設(shè)計(jì)圖就是.h文件,也就是頭文件。具體機(jī)翼的實(shí)現(xiàn)也就相當(dāng)于.cpp文件了。
所以,在程序中只需要應(yīng)用頭文件,也就是只需要知道接口的設(shè)計(jì)圖。等你根據(jù)接口設(shè)計(jì)圖設(shè)計(jì)好了零件,交給組裝工廠,組裝工廠(也就是連接器)會(huì)把所有的零件(編譯器編譯.cpp生成的.obj)連接起來(lái),這樣飛機(jī)就可以翱翔天空了。