C语言 宏定义中使用Do While的关键是不写while(0)后的分号和要用反斜杠换行符

执行结果截图:

 

 

 代码:

#include "stdio.h"

# define PRINT(format, ...) printf(# format, ##__VA_ARGS__)
// 注意:符号 \ 在宏定义中是代表换行
// 注意宏定义里的do{}while(0)语句是故意不打分号,这样在主程序调用宏时,可以很好配合宏后面跟着的分号.
// 宏定义中不要在do{}while(0)语句后面加分号写成了 do{}while(0); 这样就没有防出错效果了
#define SWITCH(a, b) \
do { \
temp = a; \
a = b; \
b = temp; \
} while(0) \

#define PRINT1(a, b) \
do { \
PRINT(print aa\n); \
PRINT(print bb\n); \
} while(0) \

#define PRINT2(a, b) \
do { \
PRINT(print a\n); \
PRINT(print b\n); \
} while(0) \
// 宏定义中用符号#可以把a转换为字符串"a",用符号#@可以把a转换为字符'a'
#define PRINT3(a) \
do { \
PRINT(%s: %d\n, #a, a); \
PRINT(%d: %d\n, a, a); \
} while(0)

#define TYPE1(type, name) type name_ ## type ## _type
#define TYPE2(type, name) type name ## _ ## type ## _type

#define ERROR_LOG(module) fprintf(stderr, "error: "#module"\n")

int main()
{
int a = 20;
int b = 19;
int temp;
char x = 'x';
char y = 'y';

ERROR_LOG("add");

PRINT3(a);
PRINT3(b);

/* TYPE1(int, c) 把name_和type和_type分开,然后强制连接,变为name_int_type
* c参数在宏里没有被用上,没有连接为c_int_type,这就可能和编程人员所期望的不一致
*/
TYPE1(int, c);

name_int_type = a;
PRINT3(name_int_type);

// TYPE2(int, d) 用##把name和_和type和_type分开,然后强制连接,变为d_int_type
TYPE2(int, d);

d_int_type = b;
PRINT3(d_int_type);

if (a > b)
/* 如果PRINT1没有用do{}while(0)语句,那么当主程序调用宏,
* 宏展开后是个{...} 后面会跟一个分号,
* 原来的if 宏; else... 就变成了if {...}; else ...
* 分号把else和{...}隔开了,这样编译时会报错:else前没有if
* 如果PRINT1用了do{}while(0)语句,那么宏PRINT1(a, b)展开后是do{...}while(0)
* 这时do{...}while(0)后面正好跟着分号,接成了 do{...}while(0); 这样的句子
* 这时候是if do{...}while(0); else ... 编译就不会报else前没有if的错了
*/
PRINT1(a, b);
else
PRINT2(a, b);

SWITCH(a, b);

PRINT3(a);
PRINT3(b);

if (a > b)
// 如果PRINT1没有用do{}while(0)语句,那么编译时会报错:else前没有if
PRINT1(a, b);
else
PRINT2(a, b);

// 如下测试可证,对于if do{...}while(0); else ...这样的句子,编译时是不会报else前没有if的错的
if (0)
do{
PRINT(That is great!\n);
}while(0);
else
PRINT(That is fine!\n);

return 0;
}
posted @   JohnnyH  阅读(455)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示