`

C语言中的可变参数封装

 
阅读更多

今天用C写个小程序,调试过程用printf输出下变量(测试程序也就没用log框架);输出多了没有日期也没有换行很难看,第一想法是包装一层,把参数传进来,然后再传递给printf。

 

编码的时候才发现,printf接收的是可变参数,定义可变参数的函数没问题,可是怎么传递?居然卡住了......

VS自动生成的main函数是这样的:int _tmain(int argc, _TCHAR* argv[]),看着眼熟试了一下还是行不通。只好上搜索,搜到的结果如下。

 

 

#include "stdio.h"
#include "stdafx.h"
#include <stdarg.h>

void log(const char *cmd, ...)
{
   printf("%s %s ", __DATE__, __TIME__);
   va_list args;       //定义一个va_list类型的变量,用来储存单个参数
   va_start(args,cmd); //使args指向可变参数的第一个参数
   vprintf(cmd,args);  //必须用vprintf等带V的
   va_end(args);       //结束可变参数的获取
   printf("\n");       //输出换行
}

 

参考链接:

https://www.cnblogs.com/ThatsMyTiger/p/6924462.html

http://www.cnblogs.com/cpoint/p/3368993.html

https://bbs.csdn.net/topics/90162956

https://www.cnblogs.com/edver/p/8419807.html

https://www.tutorialspoint.com/cprogramming/c_variable_arguments.htm

https://www.cprogramming.com/tutorial/c/lesson17.html

分享到:
评论

相关推荐

    C语言参数个数可变函数详解

    exec*()系列函数,用于在程序中执行外部文件(main(int argc,char*argv[])算不算呢,与其说main()也是一个可变参数函数,倒不如说它是exec*()经过封装后的具备特殊功能和意义的函数,至少在原理这一级上有很多相似之...

    自己写的C语言数组处理函数,简单封装

    C的数组不太好用,简单封装后可以实现范围内的可变长数组,值得自己,终于可以不用在原生的数组上纠结了

    c语言va函数讲解.

    可变参数函数,倒不如说它是exec*()经过封装后的具备特殊功能和意义的函 数,至少在原理这一级上有很多相似之处)。由于参数个数的不确定,使va 函 数具有很大的灵活性,易用性,对没有使用过可变参数函数的编程人员...

    《你必须知道的495个C语言问题》

    《你必须知道的495个C语言问题》以问答的形式组织内容,讨论了学习或使用C语言的过程中经常遇到的一些问题。书中列出了C用户经常问的400多个经典问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预...

    你必须知道的495个C语言问题

    *2.5 在C语言中是否有模拟继承等面向对象程序设计特性的好方法? 2.6 为什么声明externf(structx*p);给我报了一个晦涩难懂的警告信息? 2.7 我遇到这样声明结构的代码:structname{intnamelen;charnamestr[1];}...

    Linux C程序设计大全

    3.7.2 实现一个简单的可变参数的函数 3.7.3 可变参数实例 3.7.4 关于printf函数的疑问——缺少整型参数 3.7.5 关于printf函数的疑问——缺少字符串地址参数 第4章 C语言中的指针与字符串 4.1 sizeof运算符 4.1.1 ...

    宋劲彬的嵌入式C语言一站式编程

    2.3. #、##运算符和可变参数 2.4. 宏展开的步骤 3. 条件预处理指示 4. 其它预处理特性 22. Makefile基础 1. 基本规则 2. 隐含规则和模式规则 3. 变量 4. 自动处理头文件的依赖关系 5. 常用的make命令行选项 23. 指针...

    数据结构课堂总结

    数据结构(C语言版) 第1章 绪论 1.1 数据抽象与数据结构  抽象中的封装:对描述事物的数据与操作进行抽象后... 数据抽象由数据类型表示,分为原子类型和结构类型,其中结构类型又分为固定聚合类型和可变聚合类型。

    51单片机系列与AVR单片机系列对比.doc

    AVR既具有简单的、可以自制的ISP下载线和Jtag仿真器,又有DIP直插的封装形式 AVR的C语言编程与C语言教科书上学习的标准C语言语法是几乎一样的,不像51的C语言, 一些bit、srf之类的变量定义在教科书中是找不到的,...

    151单片机系列与AVR单片机系列对比.doc

    AVR既具有简单的、可以自制的ISP下载线和Jtag仿真器,又有DIP直插的封装形式 AVR的C语言编程与C语言教科书上学习的标准C语言语法是几乎一样的,不像51的C语言, 一些bit、srf之类的变量定义在教科书中是找不到的,...

    2018-2019第一学期期末考试C语言(A卷).docx

    MFC中封装了大部分Windows API函数和Windows控件,它包含的功能涉及到整个Windows操作系统。MFC不仅给用户提供了Windows图形环境下应用程序的框架,而且还提供了创建应用程序的组件,这样,开发人员不必从头设计创建...

    C语言程序大作业:基于qt制作学生信息管理系统.zip

    Qt良好的封装机制使得Qt的模块化程度非常高,可重用性较好,对用户开发来货是非常方便的。Qt提供一种为signals/slots(信号和槽) 的安全类型来替代callback,使得各个元件之间的协同工作变得十分简单。 丰富的API ...

    python cookbook(第3版)

    5.9 读取二进制数据到可变缓冲区中 5.10 内存映射的二进制文件 5.11 文件路径名的操作 5.12 测试文件是否存在 5.13 获取文件夹中的文件列表 5.14 忽略文件名编码 5.15 打印不合法的文件名 5.16 增加或改变已...

    C学习深入学习总结

    11.5 你会设计带有可变参数的宏吗? 19 11.6 你知道使用宏有什么劣势吗? 20 11.7 你有没有更好的替代方案? 20 11.8 为什么说宏定义不好? 21 12 如何避免对同一头文件的多次include? 22 13 什么是声明,什么是定义...

    C语言程序设计大作业:学生成绩管理系统代码(Qt).zip

    Qt良好的封装机制使得Qt的模块化程度非常高,可重用性较好,对用户开发来货是非常方便的。Qt提供一种为signals/slots(信号和槽) 的安全类型来替代callback,使得各个元件之间的协同工作变得十分简单。 丰富的API ...

    Visual C++ 2010入门经典(第5版)--源代码及课后练习答案

    5.5.1 接受数量可变实参的函数 241 5.5.2 main( )的实参 242 5.6 小结 243 5.7 练习 243 5.8 本章主要内容 244 第6章 程序结构(2) 245 6.1 函数指针 245 6.1.1 声明函数指针 246 6.1.2 函数指针作为实参 249...

    C语言实验:基于C++&QT实现的网吧计费系统源码与实验报告(Latex).zip

    Qt良好的封装机制使得Qt的模块化程度非常高,可重用性较好,对用户开发来货是非常方便的。Qt提供一种为signals/slots(信号和槽) 的安全类型来替代callback,使得各个元件之间的协同工作变得十分简单。 丰富的API ...

Global site tag (gtag.js) - Google Analytics