C语言 函数不定长参数 ##__VA_ARGS__经典案例 - C语言零基础入门教程

目录

  • 一.##__VA_ARGS__简介
  • 二.##__VA_ARGS__经典案例
  • 三.猜你喜欢

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

一.##__**VA_ARGS__**简介

[__VA_ARGS__](https://www.codersrc.com/archives/9450.html) 在前面的文章也介绍了,有两个缺点:

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__)

二.##__VA_ARGS__经典案例

有时,我们想把调试信息输出到屏幕上,而有时则又想把它输出到一个文件中,可参考下面的例子:

/******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:C语言教程 - C语言 函数不定长参数 ##__VA_ARGS__经典案例
//@Time:2021/07/10 08:00
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/******************************************************************************************///debug.c
#include <stdio.h>
#include <string.h>
//开启下面的宏表示程序运行在调试版本, 否则为发行版本, 这里假设只有调试版本才输出调试信息
#define _DEBUG
#ifdef _DEBUG//开启下面的宏就把调试信息输出到文件,注释即输出到终端#define DEBUG_TO_FILE#ifdef DEBUG_TO_FILE//调试信息输出到以下文件#define DEBUG_FILE "/tmp/debugmsg"//调试信息的缓冲长度#define DEBUG_BUFFER_MAX 4096//将调试信息输出到文件中#define printDebugMsg(moduleName, format, ...) {\char buffer[DEBUG_BUFFER_MAX+1]={0};\snprintf( buffer, DEBUG_BUFFER_MAX \, "[%s] "format" File:%s, Line:%d\n", moduleName, ##__VA_ARGS__, __FILE__, __LINE__ );\FILE* fd = fopen(DEBUG_FILE, "a");\if ( fd != NULL ) {\fwrite( buffer, strlen(buffer), 1, fd );\fflush( fd );\fclose( fd );\}\}#else//将调试信息输出到终端#define printDebugMsg(moduleName, format, ...) \printf( "[%s] "format" File:%s, Line:%d\n", moduleName, ##__VA_ARGS__, __FILE__, __LINE__ );#endif //end for #ifdef DEBUG_TO_FILE
#else//发行版本,什么也不做#define printDebugMsg(moduleName, format, ...)
#endif  //end for #ifdef _DEBUGint main(int argc, char** argv)
{int data = 999;printDebugMsg( "TestProgram", "data = %d", data );return 0;
}

以上代码可以实现以下功能:

  1. 通过使用 ##__VA_ARGS__ 可以输出不定长参数,功能和 printf 函数一样;
  2. 通过 DEBUG_TO_FILE 宏控制选择将日志输出到控制台或者输出到文件中;
  3. 通过 _DEBUG 宏决定是否输出日志,如果是开发用于调试,可以定义这个宏,方便查看日志,如果是给用户使用,那么可以不定义这个宏;

三.猜你喜欢

  1. C 语言 数组下标越界和内存溢出区别
  2. C 语言 使用指针遍历数组
  3. C 语言 指针和数组区别
  4. C 语言 指针数组和数组指针区别
  5. C 语言 野指针
  6. C 语言 函数值传递和址传递
  7. C 语言 函数不定长参数
  8. C 语言 函数指针
  9. C 语言 指针函数
  10. C 语言 回调函数 callback
  11. C 语言 #pragma once
  12. C 语言 #include <> 与 #include “” 区别
  13. C 语言 const 修饰函数参数
  14. C 语言 const 和 define 区别
  15. C 语言 #运算符
  16. C 语言 ##运算符
  17. C 语言 __VA_ARGS__
  18. C 语言 ##__VA_ARGS__
  19. C 语言 函数不定长参数 ##__VA_ARGS__经典案例

未经允许不得转载:猿说编程 » C 语言 函数不定长参数 ##__VA_ARGS__经典案例

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/524819.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

总编下午茶专题汇总

《总编下午茶》是CSDN一档关注技术应用和IT前沿的访谈类栏目&#xff0c;由CSDN各主编担任该节目主持人&#xff0c;并邀请众多技术大咖分享技术热点与前沿知识&#xff0c;同时也是技术小伙伴们分享交流的最佳平台。 NLP可行性研究方向和应用热点 “现在NLP技术处于什么发展…

jq之div hide slow

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>jq之demo</title><!--线上jq库--><script src"https://code.jquery.com/jquery-3.4.1.min.js"></script><scrip…

云重磅 |央视专访任正非;拼多多被薅上亿羊毛;甲骨文对云未来的10项技术预测...

戳蓝字“CSDN云计算”关注我们哦&#xff01;嗨&#xff0c;大家好&#xff0c;重磅君带来的【云重磅】特别栏目&#xff0c;如期而至&#xff0c;每周二第一时间为大家带来重磅新闻。把握技术风向标&#xff0c;了解行业应用与实践&#xff0c;就交给我重磅君吧&#xff01;重…

jq之mousedown

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>jq之demo</title><!--线上jq库--><script src"https://code.jquery.com/jquery-3.4.1.min.js"></script><scrip…

关于云原生,这是最详细的技术知识

戳蓝字“CSDN云计算”关注我们哦&#xff01;本文旨在揭示现代软件行业的关键主题——云原生应用程序。这篇文章涉及微服务、容器和无服务器应用程序。在这里&#xff0c;我们将讨论这些技术的实际优点和缺点。微服务是什么微服务架构作为构建现代软件应用程序的强大方法而享有…

html之引入独立js方便维护jq代码

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>jq之demo</title><!--线上jq库--><script src"https://code.jquery.com/jquery-3.4.1.min.js"></script><scrip…

jq之$(“tr:even“).css(“background-color“,“yellow“)

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>jq之demo</title><!--线上jq库--><script src"https://code.jquery.com/jquery-3.4.1.min.js"></script><scrip…

容器精华问答 | Docker是否比虚拟技术要好?

戳蓝字“CSDN云计算”关注我们哦&#xff01;云计算的发展日新月异&#xff0c;新技术层出不穷&#xff0c;尤其容器技术自2013年Docker容器问世以来一路高歌猛进红遍大江南北&#xff0c;与虚拟机相比&#xff0c;容器更显优势&#xff0c;有着更轻量、更快捷、占用资源更少&a…

jq之$(“tr:odd“).css(“background-color“,“red“);

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>jq之demo</title><!--线上jq库--><script src"https://code.jquery.com/jquery-3.4.1.min.js"></script><scrip…

C语言 va_start / va_end / va_arg 自定义 printf 函数 - C语言零基础入门教程

目录 一.前言二.函数不定长参数简介 1.va_start2.va_arg3.va_end 三.win32 控制台版本四.MFC 对话框版本五.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 语言基础入门 一.前言 对 printf 函数的使用&#xff0c;我们并不陌生&#xff0c;首先我们来看看下面…

Kubernetes API 与 Operator:不为人知的开发者战争

戳蓝字“CSDN云计算”关注我们哦&#xff01;前情回顾&#xff1a;《Kubernetes API 与 Operator&#xff1a;不为人知的开发者战争&#xff08;上&#xff09;》2016 年秋天&#xff0c;原 CoreOS 公司的工程师邓洪超像往常一样&#xff0c;来到了同事位于福斯特城&#xff08…

jq之$(“:button“)

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>点击p段落&#xff0c;把它们隐藏</title><!--线上jq库--><script src"https://code.jquery.com/jquery-3.4.1.min.js">&…

要闻君说:国产5G 手机只比普通版手机贵500元?菜鸟物联网机器人分拨中心首落南京!亚马逊推出的AWS集中式备份服务来啦!...

关注并标星星CSDN云计算每周三次&#xff0c;打卡即read更快、更全了解泛云圈精彩newsgo go go 嗨&#xff0c;大家好&#xff01;偶是要闻君。借着自家年会即将开幕的兴奋劲&#xff0c;继续给各位看官们带来最新、最扎眼的泛云圈大新闻&#xff0c;还是先听首歌曲&#xff0c…

jq之$(“a[target=‘_blank‘]“)不隐藏

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>jq之demo</title><!--线上jq库--><script src"https://code.jquery.com/jquery-3.4.1.min.js"></script><scrip…

Spring精华问答 | 什么是Spring Cloud?

戳蓝字“CSDN云计算”关注我们哦&#xff01;Spring是为解决企业应用程序开发复杂性而创建的一个Java开源框架&#xff0c;应用非常广泛。业内非常流行的SSH架构中的其中一个"S"指的就是Spring。今天我们就一起来看看关于Spring的精华问答&#xff01;1Q&#xff1a;…

C语言 main 函数 - C语言零基础入门教程

目录 一.main 函数简介二.main 函数写法三.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 语言基础入门 一.main 函数简介 main 函数是 C 程序的入口函数&#xff0c;即程序的执行是从 main 函数开始&#xff0c;对其他函数的调动也是直接或间接地在 main 函数…

要闻君说:必应(Bing)搜索引擎已在国内被屏蔽;Verizon媒体业务宣布裁员7%;小米率先发布折叠屏手机...

关注并标星星CSDN云计算每周三次&#xff0c;打卡即read更快、更全了解泛云圈精彩newsgo go go 嗨&#xff0c;大家好&#xff01;偶是要闻君。年底新闻一箩筐果真眼见为实&#xff0c;绝对不假。无论是华为天罡出师再添5G风采&#xff0c;还是小米自研折叠手机惊艳于世&#x…

自定义异常小结

package com.wuming.exception; //自定义的异常类 public class MyException extends Exception{//传递数字>10;private int detail;public MyException(int a) {this.detail a;}//toString 异常的打印信息Overridepublic String toString() {return "MyExceptin{&quo…

多线程:继承Thread

package com.wuming.demo01; //创建线程方式一&#xff1a;继承Thread类&#xff0c;重写run()方法&#xff0c;调用start开启线程 //总结&#xff1a;线程开启不一定立即执行&#xff0c;由cpu调度执行 public class TestThread1 extends Thread{Overridepublic void run() {/…

高晓松侃5G!2019开年大讲揭示运营商的秘密

戳蓝字“CSDN云计算”关注我们哦&#xff01;文章来自&#xff1a;通信世界日前&#xff0c;著名音乐创作人、电影创作人、自带清华才子光环的高晓松回归母校&#xff0c;竟做了一场没有“诗和远方”全是5G的演讲&#xff01;他演讲的主题是——《5G与区块链&#xff1a;文创产…