在C語言程式中,標頭檔案被大量使用。一般而言,每個C/C++程式通常由標頭檔案(header files)和定義檔案(definition files)組成。標頭檔案作為一種包含功能函式、資料介面宣告的載體檔案,主要用於儲存程式的宣告(declaration),而定義檔案用於儲存程式的實現 (implementation)。 .c就是你寫的程式檔案我們稱為“原始檔”,一般字尾為.h的我們稱為標頭檔案。
標頭檔案的主要作用在於多個程式碼檔案全域性變數(函式)的重用、防止定義的衝突,對各個被呼叫函式給出一個描述,其本身不需要包含程式的邏輯實現程式碼,它只起描述性作用,使用者程式只需要按照標頭檔案中的介面宣告來呼叫相關函式或變數,連結器會從庫中尋找相應的實際定義程式碼。
標頭檔案是副檔名為 .h 的檔案,包含了 C 函式宣告和宏定義,被多個原始檔中引用共享。有兩種型別的標頭檔案:程式設計師編寫的標頭檔案和編譯器自帶的標頭檔案。
在程式中要使用標頭檔案,需要使用 C 預處理指令 #include 來引用它。我們經常使用的 stdio.h 標頭檔案,它是編譯器自帶的標頭檔案。
引用標頭檔案相當於複製標頭檔案的內容,但是我們不會直接在原始檔中複製標頭檔案的內容,因為這麼做很容易出錯,特別在程式是由多個原始檔組成的時候。
A simple practice in C 或 C++ 程式中,建議把所有的常量、宏、系統全域性變數和函式原型寫在標頭檔案中,在需要的時候隨時引用這些標頭檔案。
引用標頭檔案的語法
使用預處理指令 #include 可以引用使用者和系統標頭檔案。它的形式有以下兩種:
#include <file>
這種形式用於引用系統標頭檔案。它在系統目錄的標準列表中搜索名為 file 的檔案。在編譯原始碼時,您可以透過 -I 選項把目錄前置在該列表前。
#include "file"
這種形式用於引用使用者標頭檔案。它在包含當前檔案的目錄中搜索名為 file 的檔案。在編譯原始碼時,您可以透過 -I 選項把目錄前置在該列表前。
編譯器會用一些目錄存放公共標頭檔案,如果<>則只在這些目錄下找標頭檔案,如果用""先在當前目錄下找,如果找不到則在這些目錄下找。不可能搜尋所有目錄,這樣效率太低。一般來說,自己定義的標頭檔案應該用"",因為這些檔案放在工程目錄(也就是編譯器的當前目錄)下,而不是放在公共標頭檔案目錄下,如果用<>則找不到標頭檔案。而系統提供的標頭檔案,比如庫函式的標頭檔案,可以用<>不過保險的話,用""肯定可以找到所有標頭檔案,包括系統庫函式標頭檔案和自己定義的標頭檔案
引用標頭檔案的操作
#include 指令會指示 C 預處理器瀏覽指定的檔案作為輸入。預處理器的輸出包含了已經生成的輸出,被引用檔案生成的輸出以及 #include 指令之後的文字輸出。例如,如果您有一個頭檔案 add.h,如下:
#ifndef __ADD_H__//定義標頭檔案
#define __ADD_H__
int funAdd(int x,int y);//函式的宣告
#endif
add.cpp檔案下函式的實現,如下:
#include <stdio.h>
#include "add.h"
int funAdd(int x,int y)//函式的實現
{
return x+y;
}
主程式main.cpp下包含#include “add.h”檔案
#include "add.h"//這裡相當於可以使用add.h標頭檔案裡的功能,相當於提供給main.cpp函式一個介面
int main(void)
int i = funAdd(3,4);
printf("%d\n",i);
return 0;
編譯器會看到如下的程式碼資訊:
int main (void)
只引用一次標頭檔案
如果一個頭檔案被引用兩次,編譯器會處理兩次標頭檔案的內容,這將產生錯誤。為了防止這種情況,標準的做法是把檔案的整個內容放在條件編譯語句中,如下:
//函式宣告、全域性變數等
這種結構就是通常所說的包裝器 #ifndef。當再次引用標頭檔案時,條件為假,因為 __ADD_H__ 已定義。此時,預處理器會跳過檔案的整個內容,編譯器會忽略它。
有條件引用
有時需要從多個不同的標頭檔案中選擇一個引用到程式中。例如,需要指定在不同的作業系統上使用的配置引數。您可以透過一系列條件來實現這點,如下:
#if SYSTEM_1
# include "system_1.h"
#elif SYSTEM_2
# include "system_2.h"
#elif SYSTEM_3
...
但是如果標頭檔案比較多的時候,這麼做是很不妥當的,預處理器使用宏來定義標頭檔案的名稱。這就是所謂的有條件引用。它不是用標頭檔案的名稱作為 #include 的直接引數,您只需要使用宏名稱代替即可:
#define SYSTEM_H "system_1.h"
#include SYSTEM_H
SYSTEM_H 會擴充套件,預處理器會查詢 system_1.h,就像 #include 最初編寫的那樣。SYSTEM_H 可透過 -D 選項被您的 Makefile 定義。
首先我要說這樣的問題儘量不要在這裡問,隨便百度下就有答案,你問的這個應該是C語言,無非就是搜尋路徑不一樣<>是從系統路徑查詢,""是從專案目錄查詢。
在C語言程式中,標頭檔案被大量使用。一般而言,每個C/C++程式通常由標頭檔案(header files)和定義檔案(definition files)組成。標頭檔案作為一種包含功能函式、資料介面宣告的載體檔案,主要用於儲存程式的宣告(declaration),而定義檔案用於儲存程式的實現 (implementation)。 .c就是你寫的程式檔案我們稱為“原始檔”,一般字尾為.h的我們稱為標頭檔案。
標頭檔案的主要作用在於多個程式碼檔案全域性變數(函式)的重用、防止定義的衝突,對各個被呼叫函式給出一個描述,其本身不需要包含程式的邏輯實現程式碼,它只起描述性作用,使用者程式只需要按照標頭檔案中的介面宣告來呼叫相關函式或變數,連結器會從庫中尋找相應的實際定義程式碼。
標頭檔案是副檔名為 .h 的檔案,包含了 C 函式宣告和宏定義,被多個原始檔中引用共享。有兩種型別的標頭檔案:程式設計師編寫的標頭檔案和編譯器自帶的標頭檔案。
在程式中要使用標頭檔案,需要使用 C 預處理指令 #include 來引用它。我們經常使用的 stdio.h 標頭檔案,它是編譯器自帶的標頭檔案。
引用標頭檔案相當於複製標頭檔案的內容,但是我們不會直接在原始檔中複製標頭檔案的內容,因為這麼做很容易出錯,特別在程式是由多個原始檔組成的時候。
A simple practice in C 或 C++ 程式中,建議把所有的常量、宏、系統全域性變數和函式原型寫在標頭檔案中,在需要的時候隨時引用這些標頭檔案。
引用標頭檔案的語法
使用預處理指令 #include 可以引用使用者和系統標頭檔案。它的形式有以下兩種:
#include <file>
這種形式用於引用系統標頭檔案。它在系統目錄的標準列表中搜索名為 file 的檔案。在編譯原始碼時,您可以透過 -I 選項把目錄前置在該列表前。
#include "file"
這種形式用於引用使用者標頭檔案。它在包含當前檔案的目錄中搜索名為 file 的檔案。在編譯原始碼時,您可以透過 -I 選項把目錄前置在該列表前。
編譯器會用一些目錄存放公共標頭檔案,如果<>則只在這些目錄下找標頭檔案,如果用""先在當前目錄下找,如果找不到則在這些目錄下找。不可能搜尋所有目錄,這樣效率太低。一般來說,自己定義的標頭檔案應該用"",因為這些檔案放在工程目錄(也就是編譯器的當前目錄)下,而不是放在公共標頭檔案目錄下,如果用<>則找不到標頭檔案。而系統提供的標頭檔案,比如庫函式的標頭檔案,可以用<>不過保險的話,用""肯定可以找到所有標頭檔案,包括系統庫函式標頭檔案和自己定義的標頭檔案
引用標頭檔案的操作
#include 指令會指示 C 預處理器瀏覽指定的檔案作為輸入。預處理器的輸出包含了已經生成的輸出,被引用檔案生成的輸出以及 #include 指令之後的文字輸出。例如,如果您有一個頭檔案 add.h,如下:
#ifndef __ADD_H__//定義標頭檔案
#define __ADD_H__
int funAdd(int x,int y);//函式的宣告
#endif
add.cpp檔案下函式的實現,如下:
#include <stdio.h>
#include "add.h"
int funAdd(int x,int y)//函式的實現
{
return x+y;
}
主程式main.cpp下包含#include “add.h”檔案
#include <stdio.h>
#include "add.h"//這裡相當於可以使用add.h標頭檔案裡的功能,相當於提供給main.cpp函式一個介面
int main(void)
{
int i = funAdd(3,4);
printf("%d\n",i);
return 0;
}
編譯器會看到如下的程式碼資訊:
int funAdd(int x,int y);//函式的宣告
int funAdd(int x,int y)//函式的實現
{
return x+y;
}
int main (void)
{
int i = funAdd(3,4);
printf("%d\n",i);
return 0;
}
只引用一次標頭檔案
如果一個頭檔案被引用兩次,編譯器會處理兩次標頭檔案的內容,這將產生錯誤。為了防止這種情況,標準的做法是把檔案的整個內容放在條件編譯語句中,如下:
#ifndef __ADD_H__//定義標頭檔案
#define __ADD_H__
//函式宣告、全域性變數等
#endif
這種結構就是通常所說的包裝器 #ifndef。當再次引用標頭檔案時,條件為假,因為 __ADD_H__ 已定義。此時,預處理器會跳過檔案的整個內容,編譯器會忽略它。
有條件引用
有時需要從多個不同的標頭檔案中選擇一個引用到程式中。例如,需要指定在不同的作業系統上使用的配置引數。您可以透過一系列條件來實現這點,如下:
#if SYSTEM_1
# include "system_1.h"
#elif SYSTEM_2
# include "system_2.h"
#elif SYSTEM_3
...
#endif
但是如果標頭檔案比較多的時候,這麼做是很不妥當的,預處理器使用宏來定義標頭檔案的名稱。這就是所謂的有條件引用。它不是用標頭檔案的名稱作為 #include 的直接引數,您只需要使用宏名稱代替即可:
#define SYSTEM_H "system_1.h"
...
#include SYSTEM_H
SYSTEM_H 會擴充套件,預處理器會查詢 system_1.h,就像 #include 最初編寫的那樣。SYSTEM_H 可透過 -D 選項被您的 Makefile 定義。