一、(#if使用)
#if(條件滿足)
執行代碼1
#else
執行代碼2
#endif
實例
#define A 0 //把A定義為0
#if (A > 1)
printf("A > 1"); //編譯器沒有編譯該語句,該語句不生成匯編代碼
#elif (A == 1)
printf("A == 1"); //編譯器沒有編譯該語句,該語句不生成匯編代碼
#else
printf("A < 1"); //編譯器編譯了這段代碼,且生成了匯編代碼,執行該語句
#endif
二、(#if define使用)
#if defined (x)
...code...
#endif
#if defined(CREDIT)
credit();
#elif defined(DEBIT)
debit();
#else
printerror();
#endif
#if defined(x):它不管里面的“x”的邏輯是“真”還是“假”它只管這個程序的前面的宏定義里面有沒有定義“x”這個宏,
如果定義了x個宏,那么,編譯器會編譯中間的…code…,否則忽視中間的…code…代碼。
#if defined(x)也可以取反,也就用 #if !defined(x)
三、(#ifdef 使用)
***#ifdef的使用和#if defined()的用法一致 ***
#ifndef又和#if !defined()的用法一致
#ifdef 標識符
程序段1
#else
程序段2
#endif
四、拓展
include<stdio.h>
#define BB
#ifdef AA
#define HELLO "hello world"
#elif BB
#define HELLO "hello CC"
#endif
int main()
{
printf("%s\n",HELLO);
return 1;
}
如果你覺得這個打印會是hello CC.那你就和我犯了一樣的錯誤了。
1、如果你用gcc -E hello.c -o hello.i 編譯,(預編譯命令)會出現:error: #if with no expression的錯誤。
原因是BB雖然定義了,但是定義的是空值,放在#elif后面就不行。因為#elif不僅僅是檢查后面的宏有沒有定義,還會檢查其值。
2、#ifdef就只檢查后面的宏是否定義,而不管其值為多少。讀者可以把#defineBB改成#define AA試一下,結果就會打印hello world了。
3、再次把#define BB改成#define BB 0 試一試,這時用gcc -E hello.c -o hello.i預編譯可以編譯通過,但是編譯過程gcc hello.c -o hello,因為#elif 0為假,HELLO沒有定義。
四、拓展二
if 后未定義的字符被替換成0
(1)#if 后未定義的字符被替換成0
代碼:
#include <stdio.h>
int main(int argc, char *argv[])
{
printf("hello!\n");
#if I_LOV_U
printf("world!\n");
#endif
return 0;
}
執行結果為:
yuanlulu@ubuntu:~$ ./a.out
hello!
結果並不出人意料,但是為啥預處理器沒報錯呢, 未定義的字符“I_LOV_U”是怎么處理的呢, 《C程序設計語言》中的原話是:
預處理器進行宏擴展之后,對於沒有定義的任何標識符都將用0來代替,所以“#if I_LOV_U” 等價於“#if 0”
(2)未定義的宏也能打開條件編譯
修改代碼如下:
#include <stdio.h>
int main(int argc, char *argv[])
{
printf("hello!\n");
#if (VERSION == NEED_VERSIION)
printf("world!\n");
#endif
return 0;
}
得出的結果如下:
yuanlulu@ubuntu:~$ ./a.out
hello!
world!
明明那兩個宏沒有定義,怎么就打開了那段代碼了呢? 由上面的知識可知,預處理器進行宏擴展之后,對於沒有定義的任何標識符都將用0來代替,
所以“#if (VERSION == NEED_VERSIION)”最后被擴展為 “#if (0 == 0)”,這個條件顯然是成立的。