常用的預編譯指令包括檔案包含,巨集定義和條件編譯
檔案包含
檔案包含很簡單,也是最常見的,語法格式:
順便說一下這兩種形式的不同:#include
《標頭檔案》
#include
"標頭檔案"
尖括號<>這種方法只能引用編譯器類裡的標頭檔案
也就是編譯器只會查詢儲存系統標準標頭檔案的檔案
雙引號""這種方法編譯器先查詢當前目錄是否有指定名稱的標頭檔案
然後在從標準頭檔案目錄中查詢
在實際程式設計中,如果包含的標頭檔案是我們自己編寫的,那麼使用雙引號""這種方法
巨集定義:
巨集定義在標頭檔案中也很常見,語法格式:
識別符號的命名一般是全大寫,中間用下劃線分隔#define 識別符號
#undef 識別符號
我們來簡單說一下不常用的#undef
他的作用就是將前面定義的巨集識別符號取消定義
但是在《misra-c-2004工業標準的c規範》中要求不允許使用#undef
規則19.6(強制):不要使用#undef
通常,#undef是不需要的.當它出現在**中時,能使巨集的存在或含義產生混亂
條件編譯
條件編譯命令指定預處理器依據特定的條件來判斷保留或刪除某段源**
條件編譯有很多,在標準標頭檔案中很常見,但是在我們平時的學習中遇到的並不多
#if 和 #elif 命令
語法格式:
條件編譯區域以 #if、#ifdef 或 #ifndef 等命令作為開頭,以 #endif 命令結尾#if 表示式1
[ 組1
][#elif 表示式2
[ 組2]]
...[#elif 表示式n
[ 組n ]
][#else
[ 組n+1]
]#endif
條件編譯區域可以有任意數量的 #elif 命令,但最多乙個 #else 命令
**邏輯與條件語句if一樣
下面是從頭檔案中擷取的一段**
#ifdef 和 #ifndef 命令#if 7 <= __gnuc__ && !defined __icc
# define _gl_has_builtin_add_overflow 1
#elif defined __has_builtin
# define _gl_has_builtin_add_overflow __has_builtin (__builtin_add_overflow)
#else
# define _gl_has_builtin_add_overflow 0
#endif
語法格式:
等同於:#ifdef 識別符號
/* **段 */
#endif
如果定義了識別符號,那麼編譯**段#if defined 識別符號
/* **段 */
#endif
等同於:#ifndef 識別符號
/* **段 */
#endif
如果沒有定義識別符號,那麼編譯**段#if !defined 識別符號
/* **段 */
#endif
當然**段也可以新增#elif和#else分支
下面是從頭檔案中擷取的**段
#ifdef __wchar_max__
# define __wchar_max __wchar_max__
#elif l'\0' - 1 > 0
# define __wchar_max (0xffffffffu + l'\0')
#else
# define __wchar_max (0x7fffffff + l'\0')
#endif
C語言中的條件編譯
條件編譯的功能使得我們可以按不同的條件去編譯不同的程式部分,因而產生不同的目 標 檔案。這對於程式的移植和除錯是很有用的。條件編譯有三種形式,下面分別介紹 第一種形式 ifdef 識別符號 程式段 1 else 程式段 2 endif 它的功能是,如果識別符號已被 define 命令定義過則對程式段...
C語言中的條件編譯
很久沒更新了。因為工作之後比較忙,更多的學習記錄會寫在公司的wiki裡 目前在公司主要做c c 原來了解不夠深入,所以目前從基礎開始簡單記錄一點東西。條件編譯相關的預編譯指令,包括 define undef ifdef ifndef if elif else endif defined。define...
c語言中的條件編譯
即意味著編譯預處理 define debug 是一種沒具體定義值的預定義 僅僅是定義過 用在條件編譯中如標頭檔案中 ifndef debug define debug endif 2.int i 是變數的定義 extern int i 是變數的宣告 宣告不產生 如函式原型 變數宣告 結構宣告 巨集宣...