php网站 缓存,网站名称要注册吗,三丰云做网站教程,正邦设计上海分公司文章目录 用宏参数创建字符串#xff1a;#运算符函数宏#号作为一个预处理运算符#xff0c;可以把记号转换成字符串 预处理器粘合剂#xff1a;##运算符变参宏#xff1a;...和_ _VA_ARGS_ _参考 用宏参数创建字符串#xff1a;#运算符
函数宏
下面是一个类函数宏#… 文章目录 用宏参数创建字符串#运算符函数宏#号作为一个预处理运算符可以把记号转换成字符串 预处理器粘合剂##运算符变参宏...和_ _VA_ARGS_ _参考 用宏参数创建字符串#运算符
函数宏
下面是一个类函数宏
#define PSQR(X) printf(The square of X is %d.\n, ((X)*(X)));假设这样使用宏
PSQR(8);输出为
The square of X is 64.注意双引号字符串中的X被视为普通文本而不是一个可被替换的记号。 #号作为一个预处理运算符可以把记号转换成字符串
C允许在字符串中包含宏参数。 在类函数宏的替换体中#号作为一个预处理运算符可以把记号转换成字符串。 例如如果x是一个宏形参那么#x就是转换为字符串x的形参名。这个过程称为字符串化stringizing。
/* subst.c -- 在字符串中替换 */
#include stdio.h
#define PSQR(x) printf(The square of #x is %d.\n,((x)*(x)))
int main(void)
{int y 5;PSQR(y);PSQR(2 4);return 0;
}该程序的输出如下
The square of y is 25.
The square of 2 4 is 36.调用第1个宏时用y替换#x。 调用第2个宏时用2 4替换#x。
预处理器粘合剂##运算符
与#运算符类似##运算符可用于类函数宏的替换部分。 而且##还可用于对象宏的替换部分。 ##运算符把两个记号组合成一个记号。 例如可以这样做
#define XNAME(n) x ## n然后宏
XNAME(4)将展开为 x4。 程序演示了##作为记号粘合剂的用法。
// glue.c -- 使用##运算符
#include stdio.h
#define XNAME(n) x ## n
#define PRINT_XN(n) printf(x #n %d\n, x ## n);
int main(void)
{int XNAME(1) 14; // 变成 int x1 14;int XNAME(2) 20; // 变成 int x2 20;int x3 30;PRINT_XN(1); // 变成 printf(x1 %d\n, x1);PRINT_XN(2); // 变成 printf(x2 %d\n, x2);PRINT_XN(3); // 变成 printf(x3 %d\n, x3);return 0;
}该程序的输出如下
x1 14
x2 20
x3 30注意PRINT_XN()宏用#运算符组合字符串##运算符把记号组合为一 个新的标识符。
变参宏…和_ VA_ARGS _
一些函数如 printf()接受数量可变的参数。 C99/C11也对宏提供了这样的工具。虽然标准中未使用“可变”variadic这个词但是它已 成为描述这种工具的通用词虽然C标准的索引添加了字符串化(stringizing)词条但是标准并未把固定参数的函数或宏称为固定函数和不变宏。
通过把宏参数列表中最后的参数写成省略号即3个点…来实现这一功能。这样预定义宏_ VA_ARGS _可用在替换部分中表明省略号代表什么。例如下面的定义
#define PR(...) printf(_ _VA_ARGS_ _)假设稍后调用该宏
PR(Howdy);
PR(weight %d, shipping $%.2f\n, wt, sp);对于第1次调用_ _VA_ARGS_ _展开为1个参数Howdy 对于第2次调用_ _VA_ARGS_ _展开为3个参数weight %dshipping $%.2f\n、wt、sp。 因此展开后的代码是
printf(Howdy);
printf(weight %d, shipping $%.2f\n, wt, sp);程序演示了一个示例该程序使用了字符串的串联功能和#运算符。
// variadic.c -- 变参宏
#include stdio.h
#include math.h
#define PR(X, ...) printf(Message #X : __VA_ARGS__)
int main(void)
{double x 48;double y;y sqrt(x);PR(1, x %g\n, x);PR(2, x %.2f, y %.4f\n, x, y);return 0;
}第1个宏调用X的值是1所以#X变成1。 展开后成为
print(Message 1 : x %g\n, x);然后串联4个字符把调用简化为
print(Message 1: x %g\n, x);下面是该程序的输出
Message 1: x 48
Message 2: x 48.00, y 6.9282记住省略号只能代替最后的宏参数
#define WRONG(X, ..., Y) #X #_ _VA_ARGS_ _ #y //不能这样做参考
《C Primer Plus》