最近在看mysql源碼,其中c/c++ 文法都忘得光光了,複習一下基本的文法結構,便於看懂源碼。當然對於,經常用c/c++的來說,
這些文法是非常簡單了。
定義: #ifndef x //if not define的簡寫
#define x ... #endif
作用:
在c語言中,對同一個變數或者函數進行多次聲明是不會報錯的。所以如果h檔案裡只是進行了聲明工作,即使不使用# ifndef宏定義,
一個c檔案多次包含同一個h檔案也不會報錯。但是在c++語言中,#ifndef的範圍只是在單個檔案中。所以如果h檔案裡定義了全域變數,
即使採用#ifndef宏定義,一個c檔案包含同一個h檔案多次還是會出現全域變數重定義的錯誤。使用#ifndef可以避免下面這種錯誤:如果
在h檔案中定義了全域變數,一個c檔案包含同一個h檔案多次,如果不加#ifndef宏定義,會出現變數重複定義的錯誤;
如果加了#ifndef,則不會出現這種錯誤。
條件編譯的三種形式:
“ 條件編譯”命令允許對程式中的內容選擇性地編譯,即可以根據一定的條件選擇是否編譯。
條件編譯的命令主要有以下幾種 :
形式1 #ifndef 標識符
程式段 I
#else
程式段 2
#endif
它的作用是當 “ 標識符”已經由# d e f i n e定義過了。則編譯“ 程式段 2 ” 。 否則編譯“ 程式段 1 ” 。其中如果不需要編譯“ 程式段 2 ”。則上述
形式可以變換 為:
#ifdef 標識符
程式段 1
#endif
形式2 #ifndef 標識符
# define 標識符
程式段 1
#else
程式段 2
#endif
它的作用是當 “ 標識符 沒有由# d e f i n e定義過。 則編譯“程式段 1”。否則編譯“程式段 2” 。同樣當無“ 程式段2 ”時。則上述形式變換為:
# ifndef 標識符
# define 標識符
程式段 1
#endif
形式3 #if 運算式
程式段 1
#else
程式段 2
#endif
它的作用是 當“運算式”值為真時。編譯器段1。否則則編譯器段 2。同樣 當無程式段 2時,則上述形式變換 為 :
#if 運算式
程式段 1
#endif
以上三種形式的條件編譯預先處理,結構都可以嵌套使用。 當# e l s e後嵌套 # i f 時,可以使用預先處理命令 # e l i f , 它相 當於 # e l s e# i f 。
在程式中使用條件編譯主要是為了方便程式的調試和移植。
參考:http://baike.baidu.com/view/1617265.htm#3