宏定义中的‘#’、‘##’操作符和‘...’、‘ __变参__ ’
一、‘#’
在宏函数的替换部分,#符号用作一个预处理运算符,它可以把参数的实际值转换成字符串。
例如:
如果‘甲’是一个宏参数,那么‘#甲’就是一个字符串,表示实际参数值的名字串,即把实际参数名转化成相应的字符串。该过程称为参数字符串化.
代码如下:
#包含 “习语言系统.接口”
#定义 平方(x) 格式输出(#x "的平方是 %整。%行",(x)*(x))
整数类型 主函数(整数类型 参数个数, 字符类型* 参数[] )
{
整数类型 年龄 = 12;
平方(年龄);
平方(1+2+4);
返回 0;
}
输出如下:
年龄的平方是 144。
1+2+4的平方是 49。
这里:第一次调用宏时使用“年龄”代替#x;第二次调用时用“1+2+4"代替#x。
二、‘##’
‘##’运算符可以用在宏函数的替换部分,把两个语言符号组合成单个语言符号,如一个参数经组合成为另一个变量或函数名 。
例如:
#定义 广东车牌( 号码 ) 粤A##号码
这样宏调用:
广东车牌( 123456 )
展开后就是:
粤A123456
程序:
#包含 “习语言系统.接口”
#定义 广东车牌( 号码 ) “粤A##号码”
#定义 输出变量( 编号 ) 格式输出(“变量%整= %整%行”,编号,变量##编号 )
整数类型 主函数(整数类型 参数个数, 字符类型* 参数[] )
{
整数类型 变量1= 11, 变量2= 22;
格式输出( “车牌=%串%行”, 广东车牌( 888888) );
输出变量(1);
输出变量(2);
返回 0;
}
输出:
车牌=粤A##号码
变量1= 11
变量2= 22
由输出可见,车牌由于有双引号,没有展开, 可见##符号在双引号内不起作用。
后面的输出变量宏的 参数 1,2 经连接后被转换为变量的名字:变量1, 变量2。
假如我想用宏输出像上面的例子里的:粤A123456 这样的串改怎么做呢? 看下面例子:
#包含 “习语言系统.接口”
#定义 广东车牌( 号码 ) 粤A##号码
#定义 串化名字( X ) #X
#定义 串化车牌( 车牌 ) 串化名字( 车牌 )
#定义 输出变量( 编号 ) 格式输出(“变量%整= %整%行”,编号,变量##编号 )
整数类型 主函数(整数类型 参数个数, 字符类型* 参数[] )
{
整数类型 变量1= 11, 变量2= 22;
格式输出( “车牌=%串%行”, 串化车牌(广东车牌(888888)) );
格式输出( “车牌=%串%行”, 串化名字(广东车牌(888888)) );
输出变量(1);
输出变量(2);
返回 0;
}
这次输出如下:
车牌=粤A888888
车牌=广东车牌(888888)
变量1= 11
变量2= 22
可见本次输出使用
串化车牌 宏时, 其参数 广东车牌(888888) 先进行了展开,得到:粤A888888, 然后串化,作为字符串输出。
在使用
串化名字 宏时, 其参数 广东车牌(888888) 没有进行展开,直接进行串化,作为字符串输出。
此例演示了宏参数展开时的展开法则:
1、当宏替换部分存在 ‘#’ 或 ‘##’ 时, 宏参数不进行展开, 直接按宏参数字面进行字符串化或连接操作。
2、当宏替换部分不存在 ‘#’ 或 ‘##’ 时,宏参数假如是宏,先进行宏展开。
三、变参宏 ‘...’和‘ __变参__ ’
变参宏定义中参数列表的最后一个参数为省略号(也就是三个点)。预定义宏‘__变参__’被用在替换部分中,以表示替换发生时省略号代表的内容。
例如:
#包含 “习语言系统.接口”
#定义 宏输出(...) 格式输出(“输出=>” __变参__ )
整数类型 主函数(整数类型 参数个数, 字符类型* 参数[] )
{
宏输出( “你好%行”);
宏输出( “小明年龄=%整”,10 );
返回 0;
}
运行输出如下:
输出=>你好
输出=>小明年龄=10
省略号只能代替最后面的宏参数。
#定义 变参宏(甲,乙,...) 正确
#定义 变参宏(甲,...,乙) 错误
注:以上示例使用习语言编译工具编译。
欲了解更多中文C语言编程知识,请访问 http://www.xiyuyan.org