宏定义开关和debug printf,宏定义使用异或交换两数
1、宏定义开关和debug printf
#define DEBUG_PRINT 1#ifdef DEBUG_PRINT
#define DEBUG(format, ...) printf("FILE: "__FILE__", LINE: %d: "format"\n", __LINE__, ##__VA_ARGS__)
#else
#define DEBUG(format, ...)
#endif
宏定义DEBUG(str) 只支持一个参数的替换
自C99规范以后,编译器就开始支持不定参数的宏定义
#define DEBUG(format, ...) printf("FILE: "__FILE__", LINE: %d: "format"\n", __LINE__, ##__VA_ARGS__)
注释1:##代表 如果可变参数被忽略或为空,将使得预处理器(perprocessor)会去掉它前面的那个逗号
注释2:ANSI C标准中有几个标准预定义宏,__FILE__ 文件名,__LINE___ 行号
2、宏定义使用异或交换两数
#define swap(a, b) do{ \(a) = (a) ^ (b); \(b) = (b) ^ (a); \(a) = (a) ^ (b); \}while(0);
注释1:异或,相同为0,不同为1;与0异或不变,与1异或相反;异或满足交换律
1 #include <stdio.h>2 3 #define DEBUG_PRINT 14 5 #ifdef DEBUG_PRINT6 // 可变参数的宏定义替换7 // ##代表 如果可变参数为空,预处理器将去掉前面的逗号8 // 标准预定义宏 __FILE__文件名,__LINE__行号9 #define DEBUG(format, ...) printf("FILE: "__FILE__", LINE: %d: "format"\n", __LINE__, ##__VA_ARGS__)10 #else11 #define DEBUG(format, ...) 12 #endif13 14 #define swap(a, b) do{ \15 (a) = (a) ^ (b); \16 (b) = (b) ^ (a); \17 (a) = (a) ^ (b); \18 }while(0);19 20 void bubble_sort_min(int *a, int len);21 22 int main(int argc, char *argv[])23 {24 int array[] = {3,4,5,6,2,7,0};25 int len = sizeof(array) / sizeof(int);26 int i;27 DEBUG("before sort: ");28 for(i=0; i<len; i++)29 DEBUG("%d ", array[i]);30 DEBUG("\n");31 32 bubble_sort_min(array, len);33 34 DEBUG("after sort: ");35 for(i=0; i<len; i++)36 printf("%d ", array[i]);37 printf("\n");38 return 0;39 }40 41 void select_sort_min(int *a, int len)42 {43 int i, j;44 45 for(i=0; i<len-1; i++)46 for(j=i+1; j<len; j++)47 {48 if(a[j] < a[i])49 swap(a[j], a[i]);50 }51 52 }53 54 void bubble_sort_min(int *a, int len)55 {56 int i, j;57 for(i=0; i<len-1; i++)58 for(j=0; j<len-1; j++)59 if(a[j] > a[j+1])60 swap(a[j], a[j+1]);61 }
宏定义开关和debug printf,宏定义使用异或交换两数相关推荐
- C 预处理器 —— __DATE__ # __TIME__ # __FILE__ # __LINE__ # __STDC__ (预处理宏的使用 —— 打印debug信息:)
预定义宏: ANSI C 定义了许多宏.在编程中您可以使用这些宏,但是不能直接修改这些预定义的宏. 宏 描述 __DATE__ 当前日期,一个以 "MMM DD YYYY&quo ...
- c语言如何增加编译宏,C中的预编译宏定义
在将一个C源程序转换为可执行程序的过程中, 编译预处理是最初的步骤. 这一步骤是由预处理器(preprocessor)来完成的. 在源流程序被编译器处理之前, 预处理器首先对源程序中的"宏( ...
- C/C++常用宏定义,注意事项,宏中#和##的用法
总结下宏和函数的不同之处,以供大家写代码时使用,这段总结摘自<C和指针>一书. 当然宏定义非常重要的,它可以帮助我们防止出错,提高代码的可移植性和可读性等. 下面列举一些成熟软件中常用得宏 ...
- c语言宏定义比较三个数大小,C语言中两个宏进行大小对比,其中一个没有定义,这种行为如何定义。...
1.C语言中两个宏进行大小对比,其中一个没有定义,这种行为如何定义呢? 在学习U-boot的过程中遇到这么一个定义: # if (CONFIG_ENV_ADDR >= CONFIG_SYS_MO ...
- c语言长度宏定义运算符,C语言在宏定义中使用语句表达式和预处理器运算符
语句表达式的亮点在于定义复杂功能的宏.使用语句表达式来定义宏,不仅可以实现复杂的功能,而且还能避免宏定义带来的歧义和漏洞.下面以一个简单的最小值的宏为例子一步步说明. 1.灰常简单的么,使用条件运算符 ...
- c语言宏定义在预处理阶段,预处理和宏定义
8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 宏定义 基本概念预处理部分: #include #define 放在函数之外,一般都放在源文档的前面 预处理由预处理进程 ...
- c语言 宏do while,关于C语言宏定义 使用do{ xxxx }while()
暂时感觉像是由于":"的原因,关于使用习惯方面的问题!! 下面是copy的: 这样的宏见过么: Cpp代码 #define FOO(x) do {\ some_code_line_ ...
- 【C语言】宏定义(不带参数的宏定义和带参数的宏定义)
目录 一.不带参数的宏定义 1.定义 2.#undef 指令取消宏定义 二.带参数的宏定义 1.定义 2.宏定义参数替换的注意事项 三.带参数的宏定义和带参函数的区别 一.不带参数的宏定义 1.定义 ...
- java宏定义三目运算define_宏定义的正确写法,三目运算的宏定义
摘要: 宏,分为两类: 1.对象宏(object-like macro) 对于对象宏来说确实相对简单,但却也不是那么简单 的查找替换 2.函数宏(function-like macro) 函数宏顾名思 ...
最新文章
- 电脑前面的插孔没声音怎么设置_手机没声音是怎么回事
- Linux服务器的架设 (DHCP,NIS,SAMBA,FTP,DNS)
- MySQL 字段约束 null, not null, default, auto_increment
- BI中事实表,维度表和数据集市,数据仓库的理解
- python生成器的使用_应该如何以及为什么使用Python生成器
- 二级公共基础知识_计算机二级选择题(公共基础知识)
- 华为怎么查看手机温度_如果你的华为手机拿去维修,记得打开这个功能,防止秘密被查看...
- 实例化vue发生了什么?(详解vue生命周期)
- windows性能监视器常用计数器
- 奇葩算法系列——猴子排序
- 数字电路硬件设计系列(十三)之HDMI电路设计
- 江湖救急1—win10系统读不出u盘
- react生命周期及hooks
- 基于Android平台的个人时间管理系统的设计与实现
- c语言三胞胎素数,四胞胎素数
- 2021-07-14树题目整理
- 人工智能数学基础-线性代数5:行列式求解线性方程组和拉普拉斯定理
- 联想笔记本怎么把f1到12设置正常
- 男性找女朋友最低会要求什么学历?
- 疯狂英语超级三最宝典