1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#include<stdio.h> #define echange(a,b) {\/*宏定义中允许包含多行命令的情形,此时必须在最右边加上"\"*/ int t;\ t=a;\ a=b;\ b=t;\ } main() { int c, d; c = 2; d = 3; printf("%d %d\n", c, d); echange(c,d) printf("%d %d\n", c, d); return 0; } |
在用#define进行多行宏定义时,注释要放在"\"之前
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#include<stdio.h> #define echange(a,b) {/*宏定义中允许包含两道衣裳命令的情形,此时必须在最右边加上"\"*/\ int t;\ t=a;\ a=b;\ b=t;\ }/*在最后一行多加了一个"\"*/\ main() { int c, d; c = 2; d = 3; printf("%d %d\n", c, d); echange(c,d) printf("%d %d\n", c, d); return 0; } |
在用#define进行多行宏定义时,在最后一行加上"\“,我们使用#define进行多行定义时,默认最后一个”\“的下一行也属于宏定义范围,去掉最后一行的”\"即可
以下是代码的正确形式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#include<stdio.h> #define echange(a,b) {/*宏定义中允许包含两道衣裳命令的情形,此时必须在最右边加上"\"*/\ int t;\ t=a;\ a=b;\ b=t;\ } main() { int c, d; c = 2; d = 3; printf("%d %d\n", c, d); echange(c,d) printf("%d %d\n", c, d); return 0; } |
有时候编写程序时为方便查找错误,会在很多地方加上串口打印语句直观查看程序哪里出错。
但是,串口的输出是需要时间的,在项目基本完成时,就需要将这些打印关闭,但是一行一行的注释掉费时费力,不现实。
这时可以使用宏来当做一个"开关",直接操作这个宏就可以实现打印的开关,例如:
1 2 |
//#define DEBUG(...) #define DEBUG printf |
另外,还可以使用几个预定义的宏进行辅助:
1 2 3 4 5 |
__FILE__ // 文件 __FUNCTION__ // 函数 __LINE__ // 行号
DEBUG("%s %s %d\n", __FILE__, __FUNCTION__, __LINE__); |
当程序为了适配更多不同的环境时,还可以使用条件宏来选择不同的代码模块:
1 2 3 4 5 |
#if 1 printf("Hello!\n"); #else printf("Hi!\n"); #endif |
交换两个数:
1 |
#define swap(a,b) ((a)=(a)+(b);(b)=(a)-(b);(a)=(a)-(b)) |
比较两个数并且返回最小的数:
1 |
#define MIN(a,b) ((a)<(b)?(a):(b)) |
求数组元素个数:
1 |
#define LENGTH(array) (sizeof(array) / sizeof(array[0])) |
1 2 3 4 5 6 |
#define SWAP(a,b) do { \ int t = 0;\ t = a; \ a = b; \ b = t; \ } while(0) |
细心的你可能已经注意到以上宏末尾都没有带分号“;”
1 2 3 4 |
#ifndef __TEST_H #define __TEST_H // 头文件内容 #endif |
1 |
#define dprint(expr) printf(#expr " = %d\n", expr) |
使用dprint(x/y)就被替换成:
1 |
printf("x/y" " = %g\n", x/y); |
即
1 |
printf("x/y = %g\n", x/y); |