宏定义中的‘#’、‘##’操作符和‘...’、‘ __变参__ ’

原创 2012年03月29日 14:17:24

1.#
假如希望在字符串中包含宏参数,ANSI C允许这样作,在类函数宏的替换部分,#符号用作一个预处理运算符,它可以把语言符号转化程字符串。例如,如果x是一个宏参量,那么#x可以把参数名转化成相应的字符串。该过程称为字符串化(stringizing).
#incldue <stdio.h>
#define PSQR(x) printf("the square of" #x "is %d.\n",(x)*(x))
int main(void)
{
    int y =4;
    PSQR(y);
    PSQR(2+4);
    return 0;
}
输出结果:
the square of y is 16.
the square of 2+4 is 36.
第一次调用宏时使用“y”代替#x;第二次调用时用“2+4"代#x。
2.##
##运算符可以使用类函数宏的替换部分。另外,##还可以用于类对象宏的替换部分。这个运算符把两个语言符号组合成单个语言符号。例如:
#define XNAME(n) x##n
这样宏调用:
XNAME(4)
展开后:
x4
程序:
#include <stdio.h>
#define XNAME(x) x##4
#define PXN(n) printf("x"#n" = %d\n",x##n)
int main(void)
{
    int XNAME(1)=12;//int x1=12;
    PXN(1);//printf("x1 = %d\n", x1);
    return 0;
}
3.可变宏 ...和_ _VA_ARGS_ _
实现思想就是宏定义中参数列表的最后一个参数为省略号(也就是三个点)。这样预定义宏_ _VA_ARGS_ _就可以被用在替换部分中,以表示省略号代表什么。比如:
#define PR(...) printf(_ _VA_ARGS_ _)
PR("hello");-->printf("hello");
PR("weight = %d, shipping = $.2f",wt,sp);
    -->printf("weight = %d, shipping = $.2f",wt,sp);
省略号只能代替最后面的宏参数。
#define W(x,...,y)错误!

// variadic.c -- variadic macros

#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;

}

In the first macro call, X has the value 1, so #X becomes "1". That makes the expansion look like this:

(#为参数加双引号。)


print("Message " "1" ": " "x = %g\n", x);

Then the four strings are concatenated, reducing the call to this:

print("Message 1: x = %g\n", x);

Here's the output:

Message 1: x = 48

Message 2: x = 48.00, y = 6.9282

Don't forget, the ellipses have to be the last macro argument:

#define WRONG(X, ..., Y) #X #_ _VA_ARGS_ _ #y(这个是错误的例子。)

宏定义中的‘#’、‘##’操作符和‘...’、‘ __变参__ ’

一、‘#’ 在宏函数的替换部分,#符号用作一个预处理运算符,它可以把参数的实际值转换成字符串。例如: 如果‘甲’是一个宏参数,那么‘#甲’就是一个字符串,表示实际参数值的名字串,即把实际参数名转化成相...
  • xiyuyan
  • xiyuyan
  • 2011年06月12日 18:17
  • 2460

宏定义中的##操作符和... and _ _VA_ARGS_ _

1.Preprocessor Glue: The ## Operator 预处理连接符:##操作符 Like the # operator, the ## operator can b...
  • args_
  • args_
  • 2016年11月03日 16:05
  • 782

宏定义中的##操作符和... and _ _VA_ARGS_ _

1.PreprocessorGlue: The ## Operator 预处理连接符:##操作符 Like the # operator,the ## operator can be used i...

宏定义中的##操作符和... and _ _VA_ARGS_ _

http://www.cnblogs.com/pengyingh/articles/2407265.html 1.Preprocessor Glue: The ## Operator ...
  • anypkv
  • anypkv
  • 2013年01月31日 15:27
  • 295

宏定义中的##操作符和... and _ _VA_ARGS_ _ .

http://www.cnblogs.com/pengyingh/articles/2407265.html 1.Preprocessor Glue: The ## Operator ...

宏定义中的#,##操作符和... and _ _VA_ARGS_ _

1.# 假如希望在字符串中包含宏参数,ANSI C允许这样作,在类函数宏的替换部分,#符号用作一个预处理运算符,它可以把语言符号转化程字符串。例如,如果x是一个宏参量,那么#x可以把参数名转化成相应...

宏定义中的##操作符和... and _ _VA_ARGS_ _

宏定义中的##操作符和... and _ _VA_ARGS_ _1.Preprocessor Glue: The ## Operator 预处理连接符:##操作符 Like the # operat...
  • nizqsut
  • nizqsut
  • 2016年08月08日 09:32
  • 155

无参宏定义的一般形式为:#define

文章来源:  http://baike.baidu.com/link?url=urV26K4MqFLWW7iOXm3ycDq6ZqjCBkm6zimo-24i3U0-awKV_F24iCsNSjYJR...

4.6宏定义之带参宏

//本文为转载,具体出处已经找不到了。这里引用为了知识传播。感谢原作者。C语言允许宏带有参数。在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数,这点和函数有些类似。就像把函数的实参传递给形参...

不定参的宏定义使用

什么是不定参 函数中的参数个数可以不固定,比如printf()函数可以一次输出若干个变量的值,这种情况就叫做不定参函数。 不定参的使用//test.h #include #include void...
  • yddj5
  • yddj5
  • 2016年12月08日 14:23
  • 330
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:宏定义中的‘#’、‘##’操作符和‘...’、‘ __变参__ ’
举报原因:
原因补充:

(最多只允许输入30个字)