#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
",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!
");
#if  I_LOV_U
 printf("world!
"); 
#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!
");
#if  (VERSION == NEED_VERSIION)
 printf("world!
"); 
#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

原文地址:https://www.cnblogs.com/retry/p/14045291.html