可能大家在学习的时候用得比较少,但是在一些代码量比较大的时候,这样使用,可以大大的提高代码的可读性,方便我们后期维护
#define test(x,format) printf(#x "= %" #format "\n", x)
说明 :
#x
在宏定义中被称为字符串化操作符,它将 x
参数转换为一个字符串,并在代码中插入。"= %"
是一个字符串,用于指定输出的格式。#format
也是字符串化操作符,将 format
参数转换为一个字符串,并在代码中插入。代码演示:
#include
#define test(x,format) printf(#x "= %" #format "\n", x)
int main() {
const char* name = "wxf";
test(name,s); //s 相当于 %s
int i = 1;
test(i, d); //d 相当于%d
return 0;
}
#define test(x,format) printf(#x "= %" #format "\n", x)
#define test2(i) test(age ## i,d) //d 相当于%d 当然这里可以替换成其他的类型
说明:
在该宏的扩展部分,它将 age
和 i
进行连接操作(使用 ##
连接运算符),形成一个新的标识符,并作为参数传递给 test
宏。
代码演示:
#include
#define test(x,format) printf(#x "= %" #format "\n", x)
#define test2(i) test(age ## i,d) //d 相当于%d 当然这里可以替换成其他的类型
int main() {
int age1 = 21,age2=22;
test2(1);
test2(2);
return 0;
}
宏的嵌套是我们常用的 , 话不多说,我们直接看例子
#define F(f) f(args)
#define args a,b
说明: 第一个宏里面的f ,替换成f(args), 然后下一个宏,将args ,替换成 a, b 。两者嵌套
代码演示:
#define F(f) f(args)
#define args a,b
void test3(int number1, int number2) {
printf(" %d + %d= %d\n ", number1, number2 , number1+ number2 );
}
int main() {
int a = 21,b=22;
F(test3);
return 0;
}
#define YUE_HUIU(name) do { \
printf("%s ,我们一起去看电影把!\n , name); \
printf("%s, 我们一起去唱歌吧!\n ", name); \
printf("%s, 我们一起回家吧!\n", name); \
}while (0);
注意: 使用了 do...while(0)
结构来创建一个匿名的代码块,目的是为了让宏展开后能够正常使用分号进行语句结束。这种技巧可以避免在使用宏时造成错误的语法解析。
代码演示:
/* '\' 表示续航符,表明这一行还没有结束 */
#define YUE_HUIU(name) do { \
printf("%s ,我们一起去看电影把!\n , name); \
printf("%s, 我们一起去唱歌吧!\n ", name); \
printf("%s, 我们一起回家吧!\n", name); \
}while (0);
int main() {
YUE_HUI("wxf");
return 0;
}
结果显示—(宏展开后的样子):
do {
printf("%s ,我们一起去看电影把!\n , "wxf");
printf("%s,我们一起去唱歌吧!\n ", "wxf");
printf("%s, 我们一起回家吧!\n", "wxf");
} while (0);
这个用法还是经常会用到的 ,我们经常会使用到一些自己定义的 头文件
代码演示:
#ifndef _TOOLS_H /* tools.h 头文件的名称 */
#ifdef _TOOLS_H
//头文件内容
#endif // _TOOLS_H