C語言條件編譯詳解

條件編譯

0.前言

  1. 本文的程序是在linux下測試通過的
  2. 本文的分析通過了下面的命令來查看預編譯結果

    gcc -E filename.c -o filename.i

    這條命令的作用是生成預處理文件filename.i

    gcc -S filename.c -o filename.s

    這條命令的作用是生成預編譯文件filename.s

    gcc -c filename.c -o filename.o

    這條命令的作用是生成彙編文件filename.o

1.使用情況

  1. 不同的產品線公用一份代碼
  2. 區分編譯產品的調試版和發佈版

2.函數的包含

  • #if…#else…#endif
#define C 1
int main()
{
    #if(C == 1)
        printf("This is first printf...\n");
    #else
        printf("This is second printf...\n");
    #endif

    return 0;
}

在linux下也可以使用gcc -DC=1 filename.c -o filename執行,效果和上面相同

在gcc下 -D是進入宏的意思


  • if…else
#define C 1
int main()
{
    if(C == 1)
        printf("This is first printf...\n");
    else
        printf("This is second printf...\n");

    return 0;
}
  • 區別:

1.條件編譯是預編譯指令(最終預編譯是隻有一條printf),控制是否編譯某段代碼(確定的)
2.if…else是在運行時選擇(最終有兩條printf),分開執行某些代碼

3.頭文件的包含

  • 問題:

如果一個函數調用了一個頭文件,同時這個頭文件包含了另外一個頭文件,那麼在編譯時會出現錯誤,意思爲重複定義另外一個頭文件的內容

  • 解決:

可以在被包含的頭文件裏使用條件編譯(一般的編譯器已經自動添加了)

#ifdef (_頭文件名_H_)
#define (_頭文件名_H_)
#endif

4.條件編譯的使用

#ifdef DEBUG
    //宏定義日誌文件
    #define LOG(s) printf("[%s:%d] %s\n", __FIEL__, __LINE__, s)
#else
    #define LOG(S) NULL
#endif

#ifdef Product
void f()
{
    printf("This is a Product!\n");
}
#else
void f()
{}
#endif

int main()
{
    LOG("Enter main...\n");
    f();

    printf("1 Query\n");
    printf("2 Record\n");
    printf("3 Delete\n");

    #ifdef Product  //高級查詢
    printf("4 Product\n");
    printf("5 Services\n");
    printf("6 Exit\n");
    #else
    printf("4 Exit\n");
    #endif

    LOG("Exit main...\n");
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章