其實標頭檔案與原始檔並無本質區別,只不過副檔名不同,且標頭檔案無法編譯。#include就是將檔案擴充套件到原始檔內容中。標頭檔案主要實現介面的功能,而函式功能的實現由其他原始檔完成。
(1)名字在使用之前要先宣告或定義,如果編寫乙個大型程式,想使用其他檔案定義的函式,那需要能讓編譯器能夠找到那個函式,常用的方法是定義原始檔的標頭檔案,在標頭檔案中宣告(推薦方式)。還有就是可以直接包含該檔案(雖然不知道為什麼錯誤,但是還是盡量遵從好的程式設計習慣)
錯誤的方式,原始檔直接包含另一原始檔,當然這是不建議的方式。
#include "putout.cpp"
int main()
#include
using namespace std;
int putout(int i,int j)
標頭檔案定義
#ifndef putout_h_included
#define putout_h_included
int putout(int,int);//輸出兩個數字
#endif // putout_h_included
而標頭檔案中函式的定義在putout.cpp中,執行結果顯示e:\c++練習\標頭檔案有關練習\useheader.o:useheader.cpp|| undefined reference to `putout(int, int)'|
||=== build failed: 1 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
說明沒有找到putout.cpp中函式的定義。那標頭檔案是如何找到函式定義的呢?
通過查資料得知以下內容:
編譯器的處理過程包括預處理、編譯、鏈結、生成可執行檔案。
#include預處理命令屬於預處理過程,進行文字替換。
編譯過程中,生成目標檔案。標頭檔案中的函式宣告只保證了編譯不會出錯,例如標頭檔案中宣告某個函式,原始檔使用該函式,可是編譯過程並不能找到該函式的實現,將函式或變數視為乙個個的符號,找到函式實現的任務落在下一過程。
鏈結過程負責處理程式中的乙個個的符號,使之變得有真實意義,該過程會去其他目標檔案中查詢函式的實現,呼叫函式。最後形成乙個可執行程式。
在這裡所面臨的問題是,無法使編譯器找到實現函式檔案生成的目標檔案。查到的解決方法有兩個,第一將多個原始檔組建為專案(project),ide就會自動找到函式實現原始檔,或者將原始檔生成庫檔案。第二是通過使用makefile的方式。乙個工程中的原始檔不計數,其按型別、功能、模組分別放在若干個目錄中,makefile定義了一系列的規則來指定,哪些檔案需要先編譯,哪些檔案需要後編譯,哪些檔案需要重新編譯,甚至於進行更複雜的功能操作,因為 makefile就像乙個
shell指令碼
一樣,其中也可以執行
作業系統
標頭檔案可以出現的內容包括類定義,由常量表示式初始化的const變數,inline函式定義,變數的宣告,函式的宣告。
為什麼不能再標頭檔案中定義函式及變數參見
為什麼標頭檔案中可以出現類定義?
標頭檔案中保護符的出現可以保證類不會重複定義。
為什麼標頭檔案中可以出現由常量表示式初始化的const變數?
在標頭檔案中定義const變數的原因使多個檔案使用相同的常量值。const變數預設為定義該變數檔案的區域性變數,所以不會出現重複定義的問題。為了使各個檔案中的使用相同的常量值,所以使用常量表示式初始化而不是變數。(為什麼不使用變數呢,你要用也沒人攔著你,不過變數在執行階段才能確定值,而且需要去其他原始檔中查詢變數的值到底是多少,而且很不安全,如果變數值改變,那常量值是不是也改變了,需要重新編譯,還不如直接在標頭檔案中宣告變數呢)
為什麼可以標頭檔案中可以出現inline函式定義?
inline函式宣告適用於那些**量較少,但是使用頻率較多的函式。普通函式的放在**區,由系統分配**入口位址,當需要呼叫函式時,就將程式控制權交給普通函式,執行完後將返回值返回給呼叫函式者。這樣一來一回很耗費時間。而內聯函式(inline函式)的使用方法為將它在程式中的每個呼叫點「內聯地」展開。可以簡單地理解為將**展開。這樣一來沒有改變程式的控制權,程式執行的時間大大減少。將內聯函式定義放在標頭檔案中,這樣編譯器才知道如何展開內聯函式。
C 學習積累 不斷更新
分享乙個c 的學習 1.結構體 struct 所有的成員在預設條件下都是 public 類 class 所有資料成員在預設條件下都是private 2.建構函式 採用的是類名,前邊不需要加返回值。3.在定義的類後邊一定要加 例如 void 4.類的繼承。include class animal vo...
C語言基礎(不斷更新)
1.memcpy memmove memccpy的區別 字串函式功能查詢 memcpy要求源串和目的串不能重疊 memccpy copy直至遇到由引數指定的ch.memmove 源串和目的串可以重疊。2.strcpy寫法 面試常考題型之strcpy寫法 注意丟擲異常,如果指標無效,丟擲異常,thro...
C 常用函式集合 不斷更新
其它函式庫 1.strncpy char to,const char from,size t count 將字串from 中至多count個字元複製到字串to中。如果字串from 的長度小於count,其餘部分用 0 填補。返回處理完成的字串。2.strcmp const char str1,con...