天天看點

條件編譯 使用分析

條件編譯

條件編譯的行為類似于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 可以編譯進階版本。

小結

通過編譯器指令行能夠定義預處理器使用的宏

條件編譯可以避免重複包含頭同一個頭檔案

條件編譯是在工程開發中可以差別不同産品線的代碼

條件編譯可以定義産品的釋出版和調試版