導航:首頁 > 源碼編譯 > c語言的文件頭會被編譯嗎

c語言的文件頭會被編譯嗎

發布時間:2022-01-20 18:52:07

『壹』 為什麼C語言頭文件中要用條件編譯

如果你說的是文件中避免重復包含的預處理指令,有兩個原因
a)重復編譯相同的內容,即使不會導致語法錯誤,對編譯器也是極大的開銷,在大工程中,絕對是不可容忍的,持續編譯集成的代價是很高的,能省必須省

b) 有很多語法元素是不可重復編譯的,例如類型定義。你僅僅考慮變數,是遠遠不夠的。實際中,變數在頭文件中的使用是非常少的,因為全局變數也是能避免就避免的

『貳』 C語言頭文件都是什麼程序編程的會C語言了就會編頭文件了嗎

其實寫一個C語言程序可以完全不用頭文件。對#include指令,編譯過程中只是在預處理階段把包含的文件以文本形式完全替換到#include所在的那一行而已。由此可以看出,頭文件內容也是編譯器(在預處理之後)編譯的,如果自己在源文件裡面寫頭文件的內容,可以不用#include。學會C語言就應該會編寫頭文件(至於是不是有必要寫則另當別論)。
頭文件的內容一般是函數聲明、宏、內聯函數等。如果只有一個源文件,那麼完全可以不用頭文件(當然用現成的頭文件可能比較方便)。但是在多個文件中,需要超過一次使用相同聲明等代碼時,照抄顯然會增加維護成本(一旦一個源文件內改了還需要復制粘貼到另外的源文件中),這時候顯然應該使用頭文件減輕負擔。這里頭文件會被多個源文件包含生成多個目標文件,因此不應該在頭文件中放函數和全局/靜態對象的定義(而只能是聲明)以免鏈接器產生重復定義的錯誤(一般也不應該在一個源文件中包含另外的源文件)。於是一般習慣以一個頭文件對應一個源文件,主文件名相同以方便查看對應關系。此外,函數和對象聲明可以不是對應源文件而是對應外部已經編譯好的靜態庫文件(例如.lib),無需再次編譯,C標准庫就是一個例子。
====
[原創回答團]

『叄』 c語言里include包含的文件,編譯時是全部編譯還是將部分用到的內容編譯

在預處理時把代碼全部放進去,編譯時自然是全部編譯,但是後期涉及到動態庫的東西,其實有些函數沒有真的被鏈接進來(只是地址而已),這些東西慢慢來吧

『肆』 C語言代碼的頭文件與源文件有什麼區別

  1. 頭文件和源文件在本質上沒有任何區別。 只不過一般:後綴為 .h 的文件是頭文件,內含函數聲明、宏定義、結構體定義等內容。後綴為 .c 的文件是源文件,內含函數實現,變數定義等內容。而且是什麼後綴也沒有關系,只不過編譯器會默認對某些後綴的文件採取某些動作。這樣分開寫成兩個文件是一個良好的編程風格。

  2. 簡單的說其實要理解C文件與頭文件(即.h)有什麼不同之處,首先需要弄明白編譯器的工作過程,一般說來編譯器會做以下幾個過程:

①預處理階段

②詞法與語法分析階段

③ 編譯階段,首先編譯成純匯編語句,再將之匯編成跟CPU相關的二進制碼,生成各 個目標文件 (.obj文件)

④連接階段,將各個目標文件中的各段代碼進行絕對地址定位,生成跟特定平台相關 的可執行文件,當然,最後還可以用obj生成純二進制碼,也就是去掉了文件格 式信 息。(生成.exe文件)

3.比方說 在aaa.h里定義了一個函數的聲明,然後在aaa.h的同一個目錄下建立aaa.c , aaa.c里定義了這個函數的實現,然後是在main函數所在.c文件里#include這個aaa.h 然後我就可以使用這個函數了。 main在運行時就會找到這個定義了這個函數的aaa.c文件。這是因為:main函數為標准C/C++的程序入口,編譯器會先找到該函數所在的文件。假定編譯程序編譯myproj.c(其中含main())時,發現它include了mylib.h(其中聲明了函數void test()),那麼此時編譯器將按照事先設定的路徑(Include路徑列表及代碼文件所在的路徑)查找與之同名的實現文件(擴展名為.cpp或.c,此例中為mylib.c),如果找到該文件,並在其中找到該函數(此例中為void test())的實現代碼,則繼續編譯;如果在指定目錄找不到實現文件,或者在該文件及後續的各include文件中未找到實現代碼,則返回一個編譯錯誤.其實include的過程完全可以「看成」是一個文件拼接的過程,將聲明和實現分別寫在頭文件及C文件中,或者將二者同時寫在頭文件中,理論上沒有本質的區別。以上是所謂動態方式。對於靜態方式,基本所有的C/C++編譯器都支持一種鏈接方式被稱為Static Link,即所謂靜態鏈接。在這種方式下,我們所要做的,就是寫出包含函數,類等等聲明的頭文件(a.h,b.h,...),以及他們對應的實現文件(a.cpp,b.cpp,...),編譯程序會將其編譯為靜態的庫文件(a.lib,b.lib,...)。在隨後的代碼重用過程中,我們只需要提供相應的頭文件(.h)和相應的庫文件(.lib),就可以使用過去的代碼了。相對動態方式而言,靜態方式的好處是實現代碼的隱蔽性,即C++中提倡的「介面對外,實現代碼不可見」。有利於庫文件的轉發.

『伍』 關於C語言的頭文件的問題,這個頭文件是怎麼進去的,需要自己寫還是編譯器做的

頭文件編譯器會自帶一些的,這些我們大部分都已經足夠使用了。
但有時候我們需要自己寫一些定義,比如函數的申明,全局變數的申明。這樣就可以自己建一個頭文件。然後在代碼裡面添加進去就可以了。

『陸』 關於c語言頭文件編譯和運行的問題

1、只要在程序開頭加入#include<頭文件名>,在編譯過程當中,頭文件自動會被添加到源文件當中一起進行編譯。
2、編譯,編譯程序讀取源程序(字元流),對之進行詞法和語法的分析,將高級語言指令轉換為功能等效的匯編代碼,再由匯編程序轉換為機器語言,並且按照操作系統對可執行文件格式的要求鏈接生成可執行程序。
C源程序頭文件-->預編譯處理(cpp)-->編譯程序本身-->優化程序-->匯編程序-->鏈接程序-->可執行文件。

『柒』 C語言,頭文件不包含也能編譯通過

turbo
c
2.0編譯系統中如果用到輸入輸出函數是可以不寫,用到其他函數就要寫對應得頭文件,但是turbo
c
3.0中都要寫。
你最好是寫起嘛,這是一種規范,反正又不累!

『捌』 c語言,頭文件問題,和編譯問題

如果只是剛開始學習C語言就不要深究這些了,你所問問題的答案是編譯器和連接器的工作原理。

如果真心想知道,就去看一本書,名叫 深入理解計算機系統 。裡面有更全面更深入的討論。

『玖』 關於c語言的頭文件問題

如果定義了__STDC__,就說明這個編譯器遵循標准C。所以把_Cdecl定義為空字元串,也就是相當於把所有的_Cdecl刪除了。
如果沒有定義__STDC__,就是明這個編譯器不遵循標准C。那麼把_Cdecl定義為 cdecl。

其實cdecl可能也是一個宏,當編譯器支持一個叫「調用約定」的擴展時,cdecl被定義成這種擴展的語法。
之所以有這段條件編譯是因為標准C不支持「調用約定」。

『拾』 C語言編譯出現的頭文件問題

額,你有把那個頭文件iterator.h'添加到你的文件夾中么,沒有的話就會報這個錯誤的

閱讀全文

與c語言的文件頭會被編譯嗎相關的資料

熱點內容
單片機下載口叫什麼 瀏覽:186
程序員的道 瀏覽:924
雲伺服器不實名違法嗎 瀏覽:556
怎樣查看文件夾圖片是否重復 瀏覽:993
文件怎麼導成pdf文件 瀏覽:805
打開sql表的命令 瀏覽:101
安卓手機如何面部支付 瀏覽:37
天元數學app為什麼登錄不上去 瀏覽:822
明日之後為什麼有些伺服器是四個字 瀏覽:102
安卓系統l1是什麼意思 瀏覽:24
伺服器一直崩應該用什麼指令 瀏覽:922
cm202貼片機編程 瀏覽:727
php構造函數帶參數 瀏覽:178
解壓電波歌曲大全 瀏覽:344
為啥文件夾移到桌面成word了 瀏覽:858
命令符的安全模式是哪個鍵 瀏覽:758
編程中學 瀏覽:956
單片機求助 瀏覽:995
ug加工側面排銑毛坯怎麼編程 瀏覽:273
程序員有關的介紹 瀏覽:738