我們在寫程式的過程中老是在標頭檔案用這樣的語句:
#ifdef 標誌符
程式段1
#else
程式段2
#endif
我們知道這是為了進行條件編譯。即當定義了標誌符則對程式段1進行編譯,而沒有定義標誌符時則編譯程式段2。那麼為什麼要這要呢?
其實這跟事物具有多樣性一樣。我們需要對不同的狀況下採取不同的操作。例如程式的執行平台具有這種多樣性,我們在window平台下編寫的程式,可能使用某乙個庫或者與硬體相關的屬性、方法。現在要將我們的程式移植到別的計算機系統的時候,例如linux系統。那麼程式上依賴的庫或者有些和硬體相關聯的屬性和方法不得不更改,那麼我們只能在編寫程式的時候提高程式的健壯性,此時就需要條件編譯語句為我們實現這樣的功能。
我們還見過這樣的語句段:
#ifndef 標誌符
#define 標誌符1
#else
#define 標誌符1
#endif
或許上面的說法讓你有點困惑,還是舉個例子吧!
#ifndef pi
#define doublepi 3.14*2
#else
#define doublepi pi*2
#endif
問題出現了,為什麼不先直接#define pi 3.14,然後在定義doublepi呢?
這就是為了防止變數的重複定義。其實#ifndef的最主要目的是防止標頭檔案的重複包含和編譯。那麼標頭檔案的重複包含和編譯有什麼危害嗎?
有危害是明顯的,要不然費這麼大勁幹嘛呢?其實重複包含標頭檔案有以下問題:
使預處理的速度變慢了,要處理很多本來不需要處理的標頭檔案。
可能預處理器就陷入死迴圈了(其實編譯器都會規定乙個包含層數的上限)。例如h1.h
包含h2.h
,h2.h
又包含h1.h
的情況,如果不採用防止標頭檔案的重複定義,那麼預處理器就會進入死迴圈了。
標頭檔案裡有些**不允許重複出現。而重複定義標頭檔案會重複出現一些**。(雖然變數和函式允許多次宣告(只要不是多次定義就行),但標頭檔案裡有些**是不允許多次出現的)。例如:使用typedef
型別定義和結構體tag定義等,在乙個程式檔案中只允許出現一次
上面是我找網上的但是結合老師的講解我想舉乙個例子
t1.h
#include "t2.h"
int a;
int b;
t2.h
#include "t1.h"
int c;
main.cpp
#include#include "t2.h"
void main()
它會報錯如下:d:\program files\microsoft visual studio\myprojects\ifndef\t1.h(1) : warning c4182: #include nesting level is 362 deep; possible infinite recursion
d:\program files\microsoft visual studio\myprojects\ifndef\t1.h(1) : fatal error c1076: compiler limit : internal heap limit reached; use /zm to specify a higher limit
為什麼這樣呢因為你的t1.h定義了a,c變數,t2.h包含了t1.h,t1.h包含了t2.h,預處理過程會把t2.h的#include 「t1.h」變成
int a;
int b;int c;
也就是直接複製過來然而t1.h又包含了t2.h所以t1.h變成
int a;
int b;int c;
int b;int c;
這樣就重定義了
修改如下
t1.h
#ifndef t1_h
#define t1_h
int a;
int b;
#endif
t2.h
#include "t1.h"
#ifndef t2_h
#define t2_h
int c;
#endif
t3.h
#include "t2.h"
#include "t1.h"
int d;
main.cpp
#include#include "t3.h"
void main()
這樣就不會報錯了
C C 條件編譯
出處 有些程式在除錯 相容性 平台移植等情況下可能想要通過簡單地設定一些引數就生成乙個不同的軟體,這當然可以通過變數設定,把所有可能用到的 都寫進去,在初始化時配置,但在不同的情況下可能只用到一部分 就沒必要把所有的 都寫進去,就可以用條件編譯,通過預編譯指令設定編譯條件,在不同的需要時編譯不同的 ...
C C 條件編譯
04 巨集定義 05 總結 條件編譯是指預處理器根據條件編譯指令,有條件地選擇源程式 中的一部分 作為輸出,送給編譯器進行編譯。主要是為了有選擇性地執行相應操作,防止巨集替換內容 如檔案等 的重複包含。常見的條件編譯指令如下 條件編譯指令 描述 description if如果條件為真,則執行相應操...
C C 條件編譯
條件編譯就是指有條件的編譯,即根據條件去編譯 在編譯階段時就對 做出取捨,有的編譯,有的不編譯,這樣比寫成乙個個判斷函式更有效率,比如工程 大部分的地方都類似,只有個別語句因為使用的硬體版本不同,就可以使用條件編譯增加可移植性。條件編譯的 條件 可以是乙個表示式的值,也可以是乙個定義的巨集。對於前者...