C语言 ##__VA_ARGS__

零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门


一.##__VA_ARGS__原理

C 语言__VA_ARGS__ 是一个可变参数的宏,是新的 C99 规范中新增的,目前似乎只有 gcc 支持( VCVC2005 开始支持)。

__VA_ARGS__ 在前面的文章也介绍了,有两个缺点:


1.仅仅只支持字符串常量,不支持可变参数

#define LOGFUNC(...) (printf(__VA_ARGS__))

2.仅仅只支持可变参数,不支持字符串常量

#define LOGSTRINGS(fm, ...) printf(fm,__VA_ARGS__) 

对于__VA_ARGS__ 的缺点,使用 ##__VA_ARGS__ 直接完美解决!##__VA_ARGS__ 使用如下:

#define edebug(format, ...) fprintf (stderr, format, ##__VA_ARGS__)
  • 如果可变参数被忽略或为空,## 操作将使预处理器(preprocessor)去除掉它前面的那个逗号.
  • 如果你在宏调用时,确实提供了一些可变参数,GNU CPP 也会工作正常,它会把这些可变参数放到逗号的后面。

二.##__VA_ARGS__使用

/******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:C语言教程 - C语言 ##__VA_ARGS__
//@Time:2021/07/10 08:00
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/******************************************************************************************/

#include <stdio.h>

#define LOGFUNC2(fmt,...) (printf(fmt" line:%d - %s/%s   \n",##__VA_ARGS__,__LINE__,__TIME__,__DATE__));

int main()
{
    //可变参数
    LOGFUNC2("i am C++ :%d name:%s age:%d",112,"C语言教程",18);// ok 

    //字符串常量
    LOGFUNC2("i am C++ ");// ok

}
/*
输出结果:
i am C++ :112 name:C语言教程 age:18 line:7 - 08:40:32/Jul 11 2021   
i am C++  line:8 - 08:40:32/Jul 11 2021  
*/

重上面的代码可以看出,使用 ##__VA_ARGS__ 完美兼容可变参数和字符串常量输出;


三.猜你喜欢

  1. C语言 数组下标越界和内存溢出区别
  2. C语言 指针声明和定义
  3. C语言 指针 p++ / p–
  4. C语言 p++/(p)++/(p++)/p++
  5. C语言 使用指针遍历数组
  6. C语言 指针和数组区别
  7. C语言 指针数组和数组指针区别
  8. C语言 空指针 NULL
  9. C语言 void 指针
  10. C语言 野指针
  11. C语言 函数值传递和址传递
  12. C语言 函数缺省参数
  13. C语言 函数不定长参数
  14. C语言 函数指针
  15. C语言 指针函数
  16. C语言 回调函数 callback
  17. C语言 typedef
  18. C语言 define 定义常量
  19. C语言 define 防止头文件重复包含
  20. C语言 #pragma once
  21. C语言 #include <> 与 #include “” 区别
  22. C语言 const 修饰变量
  23. C语言 const 修饰指针
  24. C语言 const 修饰函数
  25. C语言 const 修饰函数参数
  26. C语言 const 和 define 区别
  27. C语言 #运算符
  28. C语言 ##运算符
  29. C语言 __VA_ARGS__
  30. C语言 ##__VA_ARGS__

未经允许不得转载:猿说编程 » C语言 ##__VA_ARGS__
喜欢(2) 打赏

评论抢沙发

评论前必须登录!

不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!!

开始学习

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏