码迷,mamicode.com
首页 > 其他好文 > 详细

可变参数省略号使用简介

时间:2016-02-19 00:16:18      阅读:263      评论:0      收藏:0      [点我收藏+]

标签:

可变参数省略号使用简介

  C允许定义形参个数和类型不确定的函数。例如,C语言中的标准函数printf便使用这种机制。在声明不确定形参的函数时,形参部分可以使用省略号“…”代替。“…”告诉编译器,在函数调用时不检查形参类型是否与实参类型相同,也不检查参数个数。

  如:

[root@centos-64-min exercise]# vi chang.c
#include <stdio.h>
int mult(int x , int y , const char * fmt , ...)
{
int result = x * y;
if(fmt)
{
printf("%s:" , fmt);
}
return result;
}

编译器只检查第一个参数,第二个参数是否为整数,检查第三个参数是否是字符串,对后面的无论是什么参数,有多少个参数全部归入省略号处理,一律不管。

[root@centos-64-min exercise]# vi chang.c
#include <stdio.h>
int mult(int x , int y , const char * fmt , ...)
{
int result = x * y;
if(fmt)
{
printf("%s" , fmt);
}
return result;
}
int main(void)
{
int s = 0;
s = mult(1 , 2 , "1*2=");
printf("%d\n" , s);

s = mult(2 , 3 , "2*3=" , "hahaha" , 12345 , 66666);        //完全忽视后面的参数“hahaha”、12345和66666
printf("%d\n" , s);
return 0;
}

"chang.c" 20L, 314C written
[root@centos-64-min exercise]# gcc -o chang chang.c
[root@centos-64-min exercise]# ./chang
1*2=2
2*3=6


可变参数在宏定义的使用

例子:

[root@centos-64-min exercise]# vi chang.c
s = rectangle_area(3 , 4 , "this rectangle‘s area is ");
#include <stdio.h>
int mult(int x , int y , const char * fmt , ...)
{
int result = x * y;
if(fmt)
{
printf("%s" , fmt);
}
return result;
}

#define rectangle_area(x , y , args...) mult(x , y , ##args)
#define square_area(x , args...) rectangle_area(x , x , ##args)
#define myprintf(args...) square_area(1 , ##args)

int main(void)
{
int s = 0;
s = rectangle_area(3 , 4 , "this rectangle‘s area is ");
printf("%d\n" , s);

s = rectangle_area(3 , 4 , "this rectangle‘s area is " , 1 , "hahaha");
printf("%d\n" , s);

s = square_area(3 , "this square‘s area is ");
printf("%d\n" , s);

s = square_area(3 , "this squre‘s area is " , "66666" , "hahaha" , 12345);
printf("%d\n" , s);

myprintf("6666666666666666666666666\n");
myprintf("hahahahahahahahahaha\n" , "66666666666666" , 12345);
return 0;
}
~
~
~
~
"chang.c" 34L, 819C written
[root@centos-64-min exercise]# gcc -o chang chang.c
[root@centos-64-min exercise]# ./chang
this rectangle‘s area is 12
this rectangle‘s area is 12
this square‘s area is 9
this squre‘s area is 9
6666666666666666666666666
hahahahahahahahahaha

 

简单解析:

myprintf("hahahahahahahahahaha\n" , "66666666666666" , 12345);

相当于:

square_area(1 ,  "hahahahahahahahahaha\n" , "66666666666666" , 12345);

相当于:

rectangle_area(1 , 1 ,"hahahahahahahahahaha\n" , "66666666666666" , 12345);

相当于:

mult(1 , 1 ,"hahahahahahahahahaha\n" , "66666666666666" , 12345);

mult只读取了mult(1 , 1 ,"hahahahahahahahahaha\n");

在这里:各层define定义的##args的值都传递给args...,最顶层的##args <=> const char * fmt , ...     所以最终mult只读取了args的第一个字符串的变量,后面的都是...处理了

 

可变参数省略号使用简介

标签:

原文地址:http://www.cnblogs.com/King-Penguin/p/5199587.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!