现象:
对于一些函数,如printf(),我们可能用到%d、%s等格式标识符,如果定义一个宏,想要实现打印两种自由指定元素组成的字符串时,就要将格式标识符作为参数传过去,而在宏中,宏的参数在printf()的字符串参数中会被视为字符串的一部分。
#include <stdio.h>
#define FF(x) printf("x打印一个数字%d\n",x);
int main()
{
FF(1);
return 0;
}
解决方案:
①利用相邻字符串自动合并的特性
两个相邻的字符串会自动合并为一个字符串
例:"abcdefg""hijklmn\n"
#include <stdio.h>
int main()
{
char arr[] = "abcdefg""hijklmn";
printf("%s\n", arr);
printf("abcdefg""hijklmn\n");
return 0;
}
具体的操作方法可以是不直接以标识符作为参数而是以标识符为内容的字符串为参数,利用其自动合并的特性达到目的。
#include <stdio.h>
#define FF(X,x,Y,y) printf("生成:"X"和"Y,x,y)
int main()
{
FF("%s","我很好","%d",250);
return 0;
}
注:宏的参数不要连着写("生成:"XY),不然会报错,可以穿插""空字符串。
②利用操作符#和##
# :把一个宏参数变成对应的字符串
对于#%d 等价于 "%d"。
那么利用#的特性,参数就可以直接写为%d、%s而不用转换为字符串。
#include <stdio.h>
#define FF(X,x,Y,y) printf("生成:"#X""#Y,x,y)
int main()
{
FF(%s,"我很好",%d,1);
return 0;
}
既然说到了#,那就顺便提一嘴##:
##:##可以把位于它两边的符号合成一个符号。它允许宏定义从分离的文本片段创建标识符。
#include <stdio.h>
#define he(x,y) x##y
int main()
{
printf("%d\n", he(NU,LL));
return 0;
}