一、(#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)”,这个条件显然是成立的。