#if #ifdef和#ifndef区别
1、#if
#if 常量表达式
程序段1
#else
程序段2
#endif
如果常量表达式的值为真(非0),则对程序段1 进行编译,否则对程序段2进行编译。
2、#ifdef
#ifdef 标识符 (或#if defined标识符)
程序段1
#else
程序段2
#endif
如果标识符已被#define命令定义过,则对程序段1进行编译;否则对程序段2进行编译。else分支可以没有。
3、#ifndef
#ifndef 标识符
程序段1
#else
程序段2
#endif
如果标识符未被#define命令定义过,则对程序段1进行编译,否则对程序段2进行编译。(与#ifdef相反)
编译预处理特点:
- 预处理指令均以#开头,结尾不加分号。
- 预处理指令可放在程序中任何位置,作用范围从定义处开始到文件结尾(或endif)处截止。
- 预处理发生在源程序正式编译前
- 宏定义是用一个标识符来表示一个字符串,这个字符串可以是常量、变量或表达式。
- 宏定义适用于使用较频繁且代码量较小的功能
示例
1、#ifdef时,标识符DEBUG未被宏定义,则不执行
#include<stdio.h>
int main(){
int a=10,b=20,c;
c=a/b;
#ifdef DEBUG
printf("a=%d,b=%d,",a,b);
#endif
printf("c=%d\n",c);
return 0;
}
输出:c=0
2、#ifdef已经被宏定义,则执行
#include<stdio.h>
#define DEBUG
int main(){
int a=14,b=15,c;
c=a/b;
#ifdef DEBUG
printf("a=%o,b=%o,",a,b);
#endif
printf("c=%d\n",c);
return 0;
}
输出:a=16,b=17,c=0
3、#ifndef时,已被宏定义,则不执行
#include<stdio.h>
#define DEBUG
int main(){
int a=20,b=10,c;
c=a/b;
#ifndef DEBUG
printf("a=%o,b=%o,",a,b);
#endif
printf("c=%d\n",c);
return 0;
}
输出:c=2