條件編譯
0.前言
- 本文的程序是在linux下測試通過的
本文的分析通過了下面的命令來查看預編譯結果
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.使用情況
- 不同的產品線公用一份代碼
- 區分編譯產品的調試版和發佈版
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;
}