條件編譯
條件編譯的行為類似于C語言中的if…else
條件編譯是預編譯訓示指令,用于控制是否編譯某段代碼。
條件編譯指令有 #if #ifdef #ifndef #else #endif 等
例如下列代碼:
#include <stdio.h>
#define C 1
int main()
{
#if( C == 1 )
printf("This is first printf...\n");
#else
printf("This is second printf...\n");
#endif
return ;
}
小技巧:使用gcc -DC=1 test.c 可以定義C=1,決定編譯哪一句代碼。
條件編譯語句與if…else…的差別在于,條件編譯可以控制編譯的程式代碼,在上述代碼中,在經過預編譯之後,隻剩下了一個printf語句來進行編譯,而使用真正的if語句,在編譯時會有兩個printf語句。
#include 中使用條件編譯
#include 的作用
預處理器發現#include後,就會尋找指令後面<>中的檔案名,并把這個檔案的内容以文本的方式包含到目前的檔案中,被包含的檔案中的文本将替換源代碼檔案中的#include指令。
#include的本質是将已經存在的檔案内容嵌入到目前檔案中。
#include的間接包含同樣會産生嵌入檔案内容的動作。
是以,可能會出現某一個頭檔案被多次包含的情況,這樣可能會産生錯誤。
如果使用條件編譯,可以随心所欲的包含頭檔案。
#ifndef _HEADER_H_
#define _HEADER_H_
//頭檔案的内容
#endif
實際工作中:
實際工程中條件編譯主要用于一下兩種情況:
- 不同的産品線共用一份代碼
- 區分編譯産品的調試版和釋出版
舉例說明:
#include <stdio.h>
#ifdef DEBUG
#define LOG(s) printf("[%s:%d] %s\n", __FILE__, __LINE__, s)
#else
#define LOG(s) NULL
#endif
#ifdef HIGH
void f()
{
printf("This is the high level product!\n");
}
#else
void f()
{
}
#endif
int main()
{
LOG("Enter main() ...");
f();
printf("1. Query Information.\n");
printf("2. Record Information.\n");
printf("3. Delete Information.\n");
#ifdef HIGH
printf("4. High Level Query.\n");
printf("5. Mannul Service.\n");
printf("6. Exit.\n");
#else
printf("4. Exit.\n");
#endif
LOG("Exit main() ...");
return ;
}
對于上面的程式,使用gcc -DDEBUG test.c 可以編譯調試版。使用gcc -DHIGH test.c 可以編譯進階版本。
小結
通過編譯器指令行能夠定義預處理器使用的宏
條件編譯可以避免重複包含頭同一個頭檔案
條件編譯是在工程開發中可以差別不同産品線的代碼
條件編譯可以定義産品的釋出版和調試版