#ifdef,#ifndef,#define,#endif解析(原)
??? 我們?cè)诳匆恍╅_源的源代碼的時(shí)候,經(jīng)常會(huì)看到如下情景:
# if defined(_PTHREADS) && !defined(_NOTHREADS) # define __STL_PTHREADS # endif ? # if defined(_UITHREADS) && !defined(_PTHREADS) && !defined(_NOTHREADS) # define __STL_UITHREADS # endif ? # if defined(__sgi) && !defined(__GNUC__) # include <standards.h> # if !defined(_BOOL) # define __STL_NO_BOOL # endif # if defined(_MIPS_SIM) && _MIPS_SIM == _ABIO32 # define __STL_STATIC_CONST_INIT_BUG # endif # if defined(_WCHAR_T_IS_KEYWORD) # define __STL_HAS_WCHAR_T # endif # ....... # if _COMPILER_VERSION >= 730 && defined(_STANDARD_C_PLUS_PLUS) # define __SGI_STL_USE_AUTO_PTR_CONVERSIONS # endif # endif??? 曾經(jīng)菜鳥和現(xiàn)在依然還是菜鳥的我,對(duì)于這個(gè)滿眼的#ifdef,#ifndef,#define,#endif,心里犯怵。我擦,這是神馬鳥東西啊!其實(shí),這些是條件編譯。對(duì)于不同平臺(tái),許多的參數(shù)定義都不是不同,那么條件編譯就是對(duì)付跨平臺(tái)的炸彈,炸毀平臺(tái)之間的藩籬。
??? 先說說#ifndef,#define,#endif,我們對(duì)此十分的熟悉。在我們項(xiàng)目的許多頭文件里面,我們經(jīng)常是這樣:
#ifndef JSON_AUTOLINK_H_INCLUDED #define JSON_AUTOLINK_H_INCLUDED ? ....... ? #endif // JSON_AUTOLINK_H_INCLUDED??? 話說這樣是為了解決重復(fù)定義的問題。例如:我在a.h中定義了class A,在b.h中也定義了class A,那么在c.cpp中都包含了a.h和b.h,按照包含頭函數(shù)的習(xí)慣,這個(gè)class A是重復(fù)定義了。為了防止這樣情況的出現(xiàn),就出現(xiàn)上面的做法。
??? 在來說說,#ifdef和#endif。一般情況下,源程序中所有的行都參加編譯。但是,有時(shí)希望對(duì)其中一部分內(nèi)容只在滿足一定條件才進(jìn)行編譯,也就是對(duì)一部分內(nèi)容指定編譯的條件,這就是“條件編譯”。那么怎么使用呢?看看以下格式:
#ifdef 標(biāo)識(shí)符 ? 程序段1 ? #else ? 程序段2 ? #endif??? 那么,我們?cè)赾onfig文件中就可以來選擇說,要編譯那個(gè)程序段。這是不是很爽呢?我不用寫兩份,只寫一份,然后編譯的時(shí)候調(diào)整以下就好了。
??? 例如下面的代碼:
#ifdef JSON_VALUE_USE_INTERNAL_MAP class ValueAllocator; class ValueMapAllocator; class ValueInternalLink; class ValueInternalArray; class ValueInternalMap; #endif // #ifdef JSON_VALUE_USE_INTERNAL_MAP??? 我在config文件中沒有#define JSON_VALUE_USE_INTERNAL_MAP的時(shí)候,上面這段代碼是被忽略的。當(dāng)我在config文件中這樣寫:
# define JSON_USE_EXCEPTION 1 ? # define JSON_VALUE_USE_INTERNAL_MAP // 增加了這個(gè)之后,整個(gè)項(xiàng)目中的JSON_VALUE_USE_INTERNAL_MAP這個(gè)部分就可以進(jìn)行編譯了 ? # ifdef JSON_IN_CPPTL # include <cpptl/config.h> # ifndef JSON_USE_CPPTL # define JSON_USE_CPPTL 1 # endif # endif ......??? #define這個(gè)東西可以定義宏,參數(shù)之類的,也可以作為條件編譯中的閥門,例如上面的例子。宏就不介紹了。我不大喜歡,因?yàn)槲铱梢杂脙?nèi)聯(lián)函數(shù)來代替。內(nèi)聯(lián)函數(shù)多帥啊,不好好用可惜的說。
??? 在次將眼光轉(zhuǎn)到本文開始的地方,有許多的條件編譯語句,有些需要解釋。
# if defined(_PTHREADS) && !defined(_NOTHREADS) // 假如有定義_PTHREADS和沒有定義_NOTHREADS,那么就定義__STL_PTHREADS吧。聽起來有點(diǎn)囧! # define __STL_PTHREADS # endif??? 這種條件編譯語句很像if(){}else{},理解起來難度不大。反正好好看就問題不大了。
??? 最后,本文有點(diǎn)像代碼貼。文字的部分不多,用貼代碼來理解。說的不好,請(qǐng)大牛們指正,謝謝了。
?
參考文獻(xiàn):
1. 《C語言程序設(shè)計(jì)》
2. 《C和指針》
3. 《C專家編程》
轉(zhuǎn)載于:https://www.cnblogs.com/ComputerG/archive/2012/03/02/2377726.html
總結(jié)
以上是生活随笔為你收集整理的#ifdef,#ifndef,#define,#endif解析(原)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: FoolWeb 各层代码实例
- 下一篇: 2012/8/3 Extjs使用TabP