Chinaunix首页 | 论坛 | 博客
  • 博客访问: 122789
  • 博文数量: 22
  • 博客积分: 395
  • 博客等级: 下士
  • 技术积分: 228
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-28 13:39
文章分类

全部博文(22)

文章存档

2013年(2)

2012年(4)

2011年(16)

我的朋友

分类: C/C++

2011-06-30 13:48:57

可变参数函数的定义:

int printf ( const char *format, ... );

一个简单的例子

  1. #include <stdarg.h>
  2. /* 函数名:max
  3. * 功能:返回n个整数中的最大值
  4. * 参数:num:整数的个数 ...:num个输入的整数
  5. * 返回值:求得的最大整数
  6. */
  7. int max ( int num, ... )
  8. {
  9.  int m = -0x7FFFFFFF; /* 32系统中最小的整数 */
  10.  va_list ap;
  11.  va_start ( ap, num );
  12.  for ( int i= 0; i< num; i++ )
  13.  {
  14.   int t = va_arg (ap, int);
  15.   if ( t > m )
  16.   {
  17.    m = t;
  18.   }
  19.  }
  20.  va_end (ap);
  21.  return m;
  22. }
  23. /* 主函数调用max */
  24. int main ( int argc, char* argv[] )
  25. {
  26.  int n = max ( 5, 5, 6 ,3 ,8 ,5); /* 求5个整数中的最大值 */
  27.  cout << n;
  28.  return 0;
  29. }



可变参数的宏里的‘##’操作说明

GCC始终支持复杂的宏,它使用一种不同的语法从而可以使你可以给可变参数一个名字,如同其它参数一样。例如下面的例子:

#define debug(format, args...) fprintf (stderr, format, args)

这和上面举的那个ISO C定义的宏例子是完全一样的,但是这么写可读性更强并且更容易进行描述。

GNU CPP还有两种更复杂的宏扩展,支持上面两种格式的定义格式。

在标准C里,你不能省略可变参数,但是你却可以给它传递一个空的参数。例如,下面的宏调用在ISO C里是非法的,因为字符串后面没有逗号:

debug ("A message")

GNU CPP在这种情况下可以让你完全的忽略可变参数。在上面的例子中,编译器仍然会有问题(complain),因为宏展开后,里面的字符串后面会有个多余的逗号。

为了解决这个问题,CPP使用一个特殊的‘##’操作。书写格式为:

#define debug(format, ...) fprintf (stderr, format, ## __VA_ARGS__)

这里,如果可变参数被忽略或为空,‘##’操作将使预处理器(preprocessor)去除掉它前面的那个逗号。如果你在宏调用时,确实提供了一些可变参数,GNU CPP也会工作正常,它会把这些可变参数放到逗号的后面。象其它的pasted macro参数一样,这些参数不是宏的扩展。




阅读(678) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:tcp_valid_flags的技巧

给主人留下些什么吧!~~