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