专栏首页C语言入门到精通基础知识 | 每日一面(64)

基础知识 | 每日一面(64)

古代的剑客们与

对手相逢时,无

论对手多么强大,

明知不敌,也要亮出自己的剑!

读者:怎样写参数个数可变的宏?

小林:一种流行的技巧是用一个单独的用括弧括起来的的 “参数” 定义和调用宏, 参数在宏扩展的时候成为类似 printf() 那样的函数的整个参数列表。

#define DEBUG(args) (printf("DEBUG: "), printf args)

if(n != 0) DEBUG(("n is %d\n", n));

明显的缺陷是调用者必须记住使用一对额外的括弧。gcc 有一个扩展可以让函数式的宏接受可变个数的参数。但这不是标准。另一种可能的解决方案是根据参数个数使用多个宏 (DEBUG1, DEBUG2, 等等), 或者用逗号玩个这样的花招:

#define DEBUG(args) (printf("DEBUG: "), printf(args))

#define _ ,

DEBUG("i = %d" _ i);

C99 引入了对参数个数可变的函数式宏的正式支持。在宏 “原型” 的末尾加上符号 ...(就像在参数可变的函数定义中), 宏定义中的伪宏 VA ARGS 就会在调用是替换成可变参数。

最后, 你总是可以使用真实的函数, 接受明确定义的可变参数。如果你需要替换宏, 使用一个函数和一个非函数式宏, 如

#define printf myprintf

C语言错误记录私密相册

有时候,正是那些意想不到之人,成就了无人能成之事。

——图灵

本文分享自微信公众号 - C语言入门到精通(gh_780327809188),作者:闫小林

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-02-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 基础知识 | 每日一练(110)

    士人有百折不回之真心,才有万变不穷之妙用。立业建功,事事要从实地着脚,若少慕声闻,便成伪果;讲道修德,念念要从虚处立基,若稍计功效,便落尘情。 ...

    闫小林
  • 12.3 索引文件

    1、除了文件本身(称做数据区)之外,另建立一张指示逻辑记录和物理记录之间一一对应关系的表——索引表。

    闫小林
  • 基础知识 | 每日一练(109)

    学生:我如何在 printf 的格式串中输出一个 ’%’?我试过 \%, 但是不 行。

    闫小林
  • TypeScript使用HashMap

    孙亖
  • 知识查差缺不漏贴:索引的分类

    数据饕餮
  • python技术面试题(十四)--数据库索引

    You raise me up,so I can stand on mountains .You raise me up,to walk on stormy s...

    小闫同学啊
  • 深入非聚集索引:SQL Server索引进阶 Level 2

    Woodson
  • 详解Mysql执行计划explain

    MySql提供了EXPLAIN语法用来进行查询分析,在SQL语句前加一个”EXPLAIN”即可。

    chenchenchen
  • 性能优化-索引优化SQL的方法

    重复索引: 重复索引是指相同的列以相同的顺序建立的同类型的索引,如下表中的 primary key和ID列上的索引就是重复索引

    cwl_java
  • 【DB笔试面试565】在Oracle中,为什么索引没有被使用?

    “为什么索引没有被使用”是一个涉及面较广的问题。有多种原因会导致索引不能被使用。首要的原因就是统计信息不准,第二原因就是索引的选择度不高,使用索引比使用全表扫描...

    小麦苗DBA宝典

扫码关注云+社区

领取腾讯云代金券