Chinaunix首页 | 论坛 | 博客
  • 博客访问: 9087428
  • 博文数量: 1732
  • 博客积分: 12961
  • 博客等级: 上将
  • 技术积分: 19830
  • 用 户 组: 普通用户
  • 注册时间: 2009-01-09 11:25
个人简介

偷得浮生半桶水(半日闲), 好记性不如抄下来(烂笔头). 信息爆炸的时代, 学习是一项持续的工作.

文章分类

全部博文(1732)

文章存档

2023年(26)

2022年(112)

2021年(217)

2020年(157)

2019年(192)

2018年(81)

2017年(78)

2016年(70)

2015年(52)

2014年(40)

2013年(51)

2012年(85)

2011年(45)

2010年(231)

2009年(287)

分类: 其他平台

2018-09-11 16:10:20


  1. LINUX C中用define定义可变参数的宏





  2. 一般在调试打印Debug信息的时候, 需要可变参数的宏. 从C99开始可以使编译器标准支持可变参数宏(variadic macros), 另外GCC也支持可变参数宏, 但是两种在细节上可能存在区别.
  3. 1. __VA_ARGS__
  4.         __VA_ARGS__ 将 "..." 传递给宏 .
  5.         #define debug(format, ...) fprintf(stderr, format, __VA_ARGS__)

  6. 2. GCC的复杂宏
  7.         GCC使用一种不同的语法,从而可以给可变参数一个名字,如同其它参数一样.
  8.         #define debug(format, args...) fprintf (stderr, format, args)
  9.         这和第一条的宏例子是完全一样的,但是这么写可读性更强并且更容易进行描述.

  10. 3. ##__VA_ARGS__
  11.         上面两个定义的宏,如果出现 debug("A Message")的时候,由于宏展开后有个多余的逗号,所以将导致编译错误.
  12.         为了解决这个问题,CPP 使用一个特殊的"##"操作,格式如下:
  13.         #define debug(format, ...) fprintf (stderr, format, ## __VA_ARGS__)
  14.         这里,如果可变参数被忽略或为空,"##"操作将使预处理器(preprocessor)去除掉它前面的那个逗号.

阅读(2551) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~