#if、#ifdef、#else等用法


一、(#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)”,這個條件顯然是成立的。

參考文章:
https://blog.csdn.net/freewaywalker/article/details/50035923?utm_medium=distribute.pc_relevant.none-task-blog-title-2&spm=1001.2101.3001.4242


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM