C++中可变参数宏使用指南

 更新时间:2026年07月09日 09:56:50   作者:TABE_  
掌握C++可变参数宏的实战技巧!本文教你用__VA_ARGS__和##灵活处理不同数量的宏参数,避免空参数编译错误,通过va_list和vsnprintf()实现强大的格式化打印字符串功能,轻松提升代码效率,立即点击,学会这个C++高级技巧

可变参数宏(Macro With Variable Number of Arguments or Variadic Macro) 是指我们可以像定义能够接受不同数量参数的普通C++函数一样,定义一个能够接受不同数量参数宏。

基本语法

#define DEBUG(format, ...) fprintf (stderr, format, __VA_ARGS__)
#define DEBUG(format, args...) fprintf (stderr, format, args)
#define DEBUG(format, args...) fprintf (stderr, format, ##args)
#define DEBUG(format, ...) fprintf (stderr, format, ##__VA_ARGS__)
  • __VA_ARGS__替代的是宏函数中最后一个具名变量后的所有内容,其本身是编译器预定义的宏
  • args为C++支持的可变参数的别名
  • 如果args或者__VA_ARGS__为空时,##会去掉args或者__VA_ARGS__前面多余的逗号,防止编译错误。

实现格式化打印字符串

使用可变参数宏实现格式化打印字符串往往需要用到vsnprint(),函数定义如下:

int vsnprintf( char* buffer, size_t buf_size, const char* fmt, va_list vlist );

vsnprintf() 函数将格式化字符串fmt 指向的字符串写入字符串缓冲区buffer,可写入的最大字符数为 buf_size ,写入字符后,添加终止空字符;如果buf_size 等于零,则不写入任何内容并且buffer 可能是空指针。

除此之外,格式化字符串fmt可能包含以 % 开头的占位符,这些占位符被作为列vlist 传递的变量的值替换

va_list

va_list类型的变量保存了可变参数的各种信息,用法如下:

va_list   args;

创建一个va_list类型的变量args,此时 args 还未初始化,类似一个空指针,接下来我们要把这个‘’空指针‘’ 指定到我们需要的位置上,比如指到fmt后。

va_start(args, fmt);

调用 va_start() ,args指向了fmt之后的参数,接下来就可以用args访问这些参数了。

 //每次返回一个int ( 根据实际情况确定类型) 参数并把位置往前推1,一般从前往后循环调用。
var_arg(args,int);   

访问完毕后,把args置空。

 va_end(args);

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • C++实现Armadillo库与OpenCV库之间的数据格式转换

    C++实现Armadillo库与OpenCV库之间的数据格式转换

    在C++领域,数据格式转换是常见且关键的任务,尤其是在使用多个不同的库进行复杂的数据处理时,Armadillo和OpenCV是两个在科学计算和计算机视觉领域非常受欢迎的库,下面我们将详细探讨如何在C++中实现Armadillo库与OpenCV库之间的数据格式转换,需要的朋友可以参考下
    2025-03-03
  • 查找算法之二分查找的C++实现

    查找算法之二分查找的C++实现

    今天小编就为大家分享一篇关于查找算法之二分查找的C++实现,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • C++ cin.getline及getline()用法详解

    C++ cin.getline及getline()用法详解

    这篇文章主要介绍了C++ cin.getline用法及C++ getline()的两种用法,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • C++课程设计之图书馆管理系统

    C++课程设计之图书馆管理系统

    这篇文章主要为大家详细介绍了C++课程设计之图书馆管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • 一文带你初识C++和命名空间

    一文带你初识C++和命名空间

    C++是在C语言基础上发展的面向对象语言,C++支持过程化、面向对象及抽象数据类型的程序设计,C++的发展包括多个版本,下面这篇文章主要介绍了一文带你初识C++和命名空间的相关资料,需要的朋友可以参考下
    2024-10-10
  • OpenCV选择图像中矩形区域并保存

    OpenCV选择图像中矩形区域并保存

    这篇文章主要为大家详细介绍了OpenCV选择图像中矩形区域并保存的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • 对C语言中sizeof细节的三点分析介绍

    对C语言中sizeof细节的三点分析介绍

    以下是对C语言中sizeof的细节进行了详细的分析介绍,需要的朋友可以参考下
    2013-07-07
  • C++全排列中递归交换法实例详解

    C++全排列中递归交换法实例详解

    在本篇文章里小编给各位整理的是关于C++全排列中递归交换法实例内容,有兴趣的朋友们可以学习下。
    2020-02-02
  • C++调用Python基础功能实例详解

    C++调用Python基础功能实例详解

    c++调用Python首先安装Python,本文以win7为例,给大家详细介绍C++调用Python基础功能,需要的朋友参考下吧
    2017-04-04
  • C++读取访问权限冲突引发异常问题的原因分析

    C++读取访问权限冲突引发异常问题的原因分析

    C语言是一门通用计算机编程语言,广泛应用于底层开发,最近在用C++写代码时经常会遇到“引发了异常: 读取访问权限冲突,所以这篇文章主要给大家介绍了关于C++读取访问权限冲突引发异常问题的相关资料,需要的朋友可以参考下
    2021-07-07

最新评论