c語言一般提供三種預處理功能:巨集處理、檔案包含、條件編譯。標頭檔案防衛式申明中會用到條件編譯中#ifndef
、#define
、#endif
的用法。所以,首先價紹下條件編譯。
一般情況下,在生成可執行檔案的過程中,源程式檔案中的所有**行都進行編譯,但是在一些跨作業系統的情況下,要求**既能在windows
下編譯執行,也能在linux
下編譯執行,因為在不同的作業系統下呼叫的某些函式只能在特定的作業系統編譯執行,此時就需要使用條件編譯,讓部分**在滿足特定條件下編譯。
條件編譯的幾種格式
#ifdef 識別符號
程式段**1#else
程式段**2#endif
作用:當識別符號被定義過,則對程式段** 1 進行編譯,否則對程式段 2 進行編譯。
平時,在進行程式除錯過程中,需要輸出一些資訊方便除錯,在除錯結束後,不需要這些資訊輸出,我們可以這樣處理:
#define debug
//然後在**中需要輸出除錯資訊的地方,寫一些輸出資訊,例如:#ifdef debugprintf("除錯需要輸出的提示資訊\n");#endif
#ifndef 識別符號
程式段** 1 #else
程式段** 2#endif
作用:若識別符號未被定義,則編譯程式段** 1,否則編譯程式段** 2。與格式 1 正好相反,release
模式與debug
模式正好相對,所以格式 1 除錯的例子也可以寫成這樣:
#define release
//然後在**中需要輸出除錯資訊的地方,寫一些輸出資訊,例如:#ifndef releaseprintf("除錯需要輸出的提示資訊\n");#endif
#if 表示式
程式段** 1#else if 表示式2
程式段** 2#else
程式段** 3#endif
跨平台專案開發,採用條件編譯可以同同一套**在不修改**的情況下在windows
平台與linux
平台編譯通過生成可執行檔案,增加**的可移植性。例如;
if __linux__
//linux專有函式**#elif _win32
//windows專有函式**#else
//其他平台專有函式**#endif
在多檔案包含的情況下,有些變數何你可能被直接的或者間接的重複定義,重複#include
的問題也可能發生,可以通過#ifndef
、#define
、#endif
防衛式宣告解決這一問題。
範例:
int g_head1 = 1;
int g_head2 = 2;
#include "head1.h"#include "head2.h"#include
此時編譯就會出現重複定義的錯誤,這是因為原始檔.cpp 包含了標頭檔案head1.h
、head2.h"
,head2.h
中也包含head1.h
標頭檔案,所以head1.h
定義的g_head1
被定義兩次。
標頭檔案head1.h
防衛式宣告改造
#ifndef _head1_#define _head1_
int g_head1 = 1;#endif
標頭檔案head2.h
防衛式宣告改造
修改後再次編譯,通過並成功執行,使用#ifndef
、#define
、#endif
組合的防衛式宣告,避免了標頭檔案內容被多次include
,所以在寫 .h 檔案時,要習慣性的使用檔案防衛式宣告。
C語言 原始檔和標頭檔案理解
簡單的說其實要理解c檔案與標頭檔案 即.h 有什麼不同之處,首先需要弄明白編譯器的工作過程,一般說來編譯器會做以下幾個過程 1.預處理階段 2.詞法與語法分析階段 3.編譯階段,首先編譯成純彙編語句,再將之彙編成跟cpu相關的二進位製碼,生成各個目標檔案 obj檔案 4.連線階段,將各個目標檔案中的...
C語言 大程式( c和 h)標頭檔案和原始檔
定義 產生 宣告 不產生 include include int max int a,int b 宣告 int main int max int a,int b 定義 這個是改良後的版本 main.c include 僅僅宣告了這個函式的型別 include 庫函式每次編譯都會使用,標頭檔案中的宣告...
c語言標頭檔案
c語言標頭檔案 每個c c程式通常分為兩個檔案。乙個檔案用於儲存 程式的宣告 declaration 稱為標頭檔案。另乙個檔案用於儲存 程式的實現 implementation 稱為定義 definition 檔案。c c程式的標頭檔案以 h 為字尾,c程式的定義檔案以 c 為字尾,c 程式的定義檔...