预处理——条件编译
条件编译
在部分情况下,希望程序的其中一部分代码只有在满足一定条件时才进行编译,否则不参与编译(只有参与编译的代码最终才能被执行),这就是条件编译。
可以使用相关指令告诉编译器根据条件执行或忽略相关代码块
#ifdef、#else和#endif
功能
#ifdef表示,如果预处理器已定义了指出的标识符,则执行#else或#endif指令之前的所有指令并编译所有C代码(比如先出现#else,则只执行到#else上一条代码)。如果预处理器未定义指出的标识符,且有#else指令,则执行#else和#endif指令之间的代码。
#ifdef、#else在一定程度上类似于if else。但必须注意的是
#else是根据需要来添加,但#endif是必须存在的。
一般格式
#ifdef 标识符
…code1…
#else
…code2…
#endif
参考代码
#ifdef NUM
//如果已经使用#define定义了NUM,则执行下列代码,到#else之前
#define NUM2 2
#else
//如果没有使用#define定义NUM,则执行下列代码
#define NUM 1
#endif
扩展
#ifdef也可用 #if defined()来实现相关功能
if define()的一般格式
#if defined(标识符)
…code…
#endif
如果前面定义过这个宏,就将code编译进去。
#ifndef
用法与#ifdef相同。
可以和#else一起使用,#endif必须存在。但跟#ifdef逻辑相反,#ifndef指令判断后面的标识符是否是未定义的。
常用于定义之前未定义的常量。当一个工程里面包含多个头文件时,使用#ifndef可以防止相同的宏被重复定义
扩展
#ifndef可用#if !defined()来实现相关功能
if !define()的一般格式格式
#if !defined(标识符)
…code…
#endif
如果前面没有定义过这个宏,就将code编译进去。
#if、#elif和#else
#if在一定程度上类似于if。
一般格式和功能
#if 条件1
…code1…
#elif 条件2
…code2…
#else
…code3…
#endif
1. 如果条件1成立,那么编译器就会把#if 与 #elif之间的code1代码编译进去
2. 如果条件1不成立、条件2成立,那么编译器就会把#elif 与 #else之间的code2代码编译进去
3. 如果条件1、2都不成立,那么编译器就会把#else 与 #endif之间的code3编译进去
4. #if 和 #elif后面的条件一般是判断宏定义而不是判断变量。(条件编译是在编译之前做的判断,宏定义也是编译之前定义的)
5. #endif不可少
参考代码
#include <stdio.h>
#define NUM 1
int main ()
{
#if NUM == 0
printf("NUM = 0");
#elif NUM > 0
printf("NUM > 0");
#else
printf("NUM < 0");
#endif
return 0;
}
输出结果为:
NUM > 0
程序分析:
首先定义了一个宏NUM,由于NUM为1,所以#elif的条件成立,printf(“NUM > 0”); 这条代码将会被编译进去,其实编译预处理后的代码为:
#include <stdio.h>
//stdio.h文件中的内容实际会代替#include <stdio.h>的位置
int main ()
{
printf("NUM > 0");
return 0;
}