完美解析C/C++条件预处理编译:#define、#if 、#ifdef、#elif、#endif

25 篇文章 0 订阅

一、预处理的条件编译
预处理主要有三个方面的内容: 1.宏定义; 2.文件包含; 3.条件编译。 预处理命令以符号“#”开头。

二、常用指令

#        空指令,无任何效果
#define  定义宏
#undef   取消已定义的宏
#if      如果给定条件为真,则编译下面代码
#ifdef   如果宏已经定义,则编译下面代码
#ifndef  如果宏没有定义,则编译下面代码
#elif    如果前面的#if给定条件不为真,当前条件为真,则编译下面代码 
         #elif预处理指令等效于#else和#if指令的综合
#endif   结束一个#if……#else条件编译块
#error   停止编译并显示错误信息

三、三种情形

情形1#ifdef XXXX
...程序段1...
#else
...程序段2...
#endif
这表明如果标识符XXXX已被#define命令定义过,则对程序段1进行编译;否则对程序段2进行编译。
 
情形2#ifndef XXXX 
...程序段1... 
#else 
...程序段2... 
#endif
这里使用了#ifndef,表示的是if not def。
和#ifdef相反的状况。(如果没有定义标识符XXXX,那么执行程序段1,否则执行程序段2)。
 
情形3#if 常量 
...程序段1...
#else
...程序段2...
#endif 
这里表示,如果常量为真(非0数字),就执行程序段1,否则执行程序段2

四、实例解析
有两个文件,一个是debug.h,另一个是用于测试的main.c

//debug.h
#ifndef DEBUG_H
#define DEBUG_H
 
#define DEBUG
 
#ifdef DEBUG 
#define debug(fmt,...)\
{\
	printf("file:%s func:%s line:%d ",__FILE__,__func__,__LINE__);\
	printf("----define---");\
	printf(fmt,##__VA_ARGS__);\
}
 
//第一种 else1
#else
#define debug(fmt,...)\
{\
	printf("file:%s func:%s line:%d ",__FILE__,__func__,__LINE__);\
	printf("----else---");\
	printf(fmt,##__VA_ARGS__);\
}
 
//第二种 else2  什么都不做
/*#else
#define debug(fmt,...) if(0)
*/
#endif//DEBUG
 
//任何时候都打印
#define error(fmt,...)\
{\
	printf("file:%s func:%s line:%d ",__FILE__,__func__,__LINE__);\
	printf(fmt,##__VA_ARGS__);\
}
 
#endif//DEBUG_H

//main.c
#include<stdio.h>
#include"debug.h"
 
int main()
{
	debug("1/...\n");
	debug("2/。。。。\n");
    //...
	printf("-----------\n");
	error("...error...\n");
}

输出结果:

file:main.c func:main line:8 ----define---1/...
file:main.c func:main line:11 ----define---2/。。。。
-----------
file:main.c func:main line:15 ...error...

来解释一波:

当 #define DEBUG 语句生效时,执行 #ifdef 部分语句

当 #define DEBUG 语句被注释,不生效时,执行 #else 部分语句

放在 #ifdef … #else … #endif 结构之外的,就是任何时候都能执行的

五、解释一下 printf(fmt,##VA_ARGS);
debug(fmt, …)就等效于printf(“fmt \n”,##VA_ARGS);

debug("%s", “abc”)<==>printf("%s \n",“abc”);

fmt表示格式符,…为参数列表

好处是,无论输出多少个参数值,都可以以上面这种统一的形式进行输出实现!

debug("1/...\n");
debug("%s %d\n","test",10);
file:main.c func:main line:8 ----define---1/...
file:main.c func:main line:9 ----define---test 10
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值