頭文件不參加編譯,為什么還要包含到源文件中
頭文件不參加編譯,為什么還要包含到源文件中
頭文件通常需要參加編譯,要包含到源文件中。當(dāng)然,你可以 把 頭文件獨(dú)立出來(lái),改名為 .c (或 .cpp), 不包含到 源文件中,與源文件分開編譯,編成 .obj 后 再鏈接也可以。
假如 某程序,確實(shí)不需要 某個(gè)頭文件,那么 就沒(méi)有必要 包含進(jìn)去。
例如,程序里 沒(méi)有用到 三角函數(shù),開方 之類 的 數(shù)學(xué) 庫(kù) 函數(shù),你就 不需要 寫 #include <math.h>。例如,程序里 沒(méi)有用到 time() 之類的 時(shí)間庫(kù) 函數(shù),你就 不需要 寫 #include <time.h>。
為什么C語(yǔ)言頭文件中要用條件編譯?
因?yàn)?你用的和你看到的頭文件是為開發(fā)者方便服務(wù)的,不是為你服務(wù)的。 有了條件編譯,開發(fā)人員可以很方便的為多種情形(比如不同硬件環(huán)境,不同軟件環(huán)境)維護(hù)一套代碼。
發(fā)布時(shí)原樣發(fā)布出來(lái)就是你看到的樣子。
你的使用條件和使用環(huán)境確定的話,可以去掉條件編譯的,只是需要花時(shí)間精力,沒(méi)人去干而已。可以下載嘗試下中文版的C語(yǔ)言:習(xí)語(yǔ)言, 頭文件里很少條件編譯。
為什么在頭文件里面用條件編譯呢?程序如下
#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語(yǔ)言為什么要包含頭文件
頭文件中含有一些聲明和已編譯好了的函數(shù),可以提高程序時(shí)間復(fù)雜度和空間復(fù)雜度,簡(jiǎn)化程序。如stdio.h頭文件中包含scanf,printf,sprintf等函數(shù),只有包含了stdio.h頭文件才能正常使用,否則無(wú)法使用,只能自己編寫其他函數(shù)代替。百科
關(guān)于頭文件編譯
頭文件不能編譯,只能編譯源文件。源文件預(yù)編譯的時(shí)候,如果碰到#include <xxx.h>,就把xxx.h中的文本內(nèi)容全部**到相應(yīng)的位置比如在cpp中寫int a[] = {#include \”a.h\”};在\”a.h\”中寫1, 2, 3, 4, 5是合法的。
預(yù)編譯后就是int a[] = {1, 2, 3, 4, 5};你還可以試驗(yàn)其他更古怪的#include方法。
再結(jié)合#define去理解預(yù)編譯的意義。
c語(yǔ)言中,把函數(shù)放在不同程序文件中,在頭文件包含進(jìn)行編譯,連接和運(yùn)行,為什么會(huì)產(chǎn)生問(wèn)題?
如果沒(méi)有添加#include \”txtReader.cpp\”你再輸入編譯命令時(shí)要同時(shí)編譯兩個(gè)文件,不能只編譯一個(gè),比如gcc main.cpp txtReader.cpp你只編譯一個(gè)文件當(dāng)然就會(huì)出這個(gè)錯(cuò)一般要建一個(gè)project