C语言##__VA_ARGS__的用法

1.作用

调试过程用到自定义的打印,可以用到##__VA_ARGS__ 

2.__VA_ARGS__用法

自定义打印用到的可变参数,使用...即可表示可变参数

#define LOG(...) printf(__VA_ARGS__)
//...表示可变参数,通过宏替换,将__VA_ARGS__替换成...

 例子:

#include <stdio.h>
 
#define LOG(...)  printf(__VA_ARGS__)

int main()
{
    char *str = "test";
    int num = 1;
    LOG("this is test \r\n");
    LOG("this is %s :%d\r\n", str, num);
 
    return 0;
}

运行结果:

this is test 
this is test :1

 3.##__VA_ARGS__用法

加上##作用:当可变参数的个数为0时,##可以把前面多余的”,“去掉,否则编译出错。

#define tim_log(fmt, ...) _tim_log( __FILE__, __LINE__, fmt, ##__VA_ARGS__, 0)
#include <stdio.h>
#include <time.h>

//"<%s:%d>:----" 打印信息的前缀
//fmt 替换成 fmt
//"\n" 换行
//__VA_ARGS__ 替换成 ...
// ## 去掉前面多余的',' 
#define LOG(fmt, ...) printf("<%s:%d>:"fmt"\n", __FILE__, __LINE__,##__VA_ARGS__) 

//...表示可变参数,__VA_ARGS__就是将...的值复制到这里
int main()
{
    char *str = "test";
    int num = 1;
    LOG("this is test __VA_ARGS__\r\n");
    LOG("this is %s __VA_ARGS__:%d\r\n", str, num);
	LOG("*******************");
 
    return 0;
}

执行结果:

<D:\Program Files\Notepad++\project\##__VA_ARGS__.c:11>:this is test __VA_ARGS__

<D:\Program Files\Notepad++\project\##__VA_ARGS__.c:12>:this is test __VA_ARGS__:1

<D:\Program Files\Notepad++\project\##__VA_ARGS__.c:13>:*******************

可见  __FILE__, __LINE__, 会被去掉,只剩下 printf("<%s:%d>:"fmt"\n", ##__VA_ARGS__) 

4、gcc 复杂宏##args用法

#define debug(format, args…) printf(format, ##args)
#的作用 : 连接两个宏,如果可变参数被忽略或为空,"##"操作将使预处理器(preprocessor)去除掉它前面的那个逗号,编译不会报错。
本文中涉及的##__VA_ARGS__与##args在代码中常见的写法:

#define print_LOG(level, fmt, ...)       printf("[%s][%d]"fmt"\n", __FUNCTION__, __LINE__, ##__VA_ARGS__)

#define print_LOG(level, fmt, args...)   SYS_LOG("[WIFI]", level, fmt,  ##args)
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用:建议使用__VA_ARGS__时与##配合使用;##__VA_ARGS__在设置log输出的宏定义时比较常见。 引用:程序开发或者看工程代码时可能在宏定义中有涉及到#、##、__VA_ARGS__和##__VA_ARGS__的使用,简单介绍下使用方法。#操作符是将其后面紧跟的符号变为字符串的形式。 #__VA_ARGS__是C语言宏定义中的一个特殊标识符,表示可变参数列表。它可以用来在宏定义中传递不定数量的参数。当我们在宏定义中使用#__VA_ARGS__时,它会被替换为传递给宏的所有参数,以逗号分隔的形式。这样,我们可以在宏定义中使用这些参数,类似于函数的参数。 而##__VA_ARGS__是在宏定义中使用可变参数列表时常见的形式。它的作用是在宏定义中使用可变参数列表时,可以将参数列表前的逗号省略掉。这样可以避免在宏定义中使用可变参数列表时出现额外的逗号。 所以,#__VA_ARGS__和##__VA_ARGS__都是在宏定义中使用可变参数列表时的常见用法,可以实现灵活的宏定义,提高代码的可读性和可维护性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [# ## __VA_ARGS__ ##__VA_ARGS__的使用说明](https://blog.csdn.net/hanxv_1987/article/details/106555870)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值