今天用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
相关推荐
exec*()系列函数,用于在程序中执行外部文件(main(int argc,char*argv[])算不算呢,与其说main()也是一个可变参数函数,倒不如说它是exec*()经过封装后的具备特殊功能和意义的函数,至少在原理这一级上有很多相似之...
C的数组不太好用,简单封装后可以实现范围内的可变长数组,值得自己,终于可以不用在原生的数组上纠结了
可变参数函数,倒不如说它是exec*()经过封装后的具备特殊功能和意义的函 数,至少在原理这一级上有很多相似之处)。由于参数个数的不确定,使va 函 数具有很大的灵活性,易用性,对没有使用过可变参数函数的编程人员...
《你必须知道的495个C语言问题》以问答的形式组织内容,讨论了学习或使用C语言的过程中经常遇到的一些问题。书中列出了C用户经常问的400多个经典问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预...
*2.5 在C语言中是否有模拟继承等面向对象程序设计特性的好方法? 2.6 为什么声明externf(structx*p);给我报了一个晦涩难懂的警告信息? 2.7 我遇到这样声明结构的代码:structname{intnamelen;charnamestr[1];}...
3.7.2 实现一个简单的可变参数的函数 3.7.3 可变参数实例 3.7.4 关于printf函数的疑问——缺少整型参数 3.7.5 关于printf函数的疑问——缺少字符串地址参数 第4章 C语言中的指针与字符串 4.1 sizeof运算符 4.1.1 ...
2.3. #、##运算符和可变参数 2.4. 宏展开的步骤 3. 条件预处理指示 4. 其它预处理特性 22. Makefile基础 1. 基本规则 2. 隐含规则和模式规则 3. 变量 4. 自动处理头文件的依赖关系 5. 常用的make命令行选项 23. 指针...
数据结构(C语言版) 第1章 绪论 1.1 数据抽象与数据结构 抽象中的封装:对描述事物的数据与操作进行抽象后... 数据抽象由数据类型表示,分为原子类型和结构类型,其中结构类型又分为固定聚合类型和可变聚合类型。
AVR既具有简单的、可以自制的ISP下载线和Jtag仿真器,又有DIP直插的封装形式 AVR的C语言编程与C语言教科书上学习的标准C语言语法是几乎一样的,不像51的C语言, 一些bit、srf之类的变量定义在教科书中是找不到的,...
AVR既具有简单的、可以自制的ISP下载线和Jtag仿真器,又有DIP直插的封装形式 AVR的C语言编程与C语言教科书上学习的标准C语言语法是几乎一样的,不像51的C语言, 一些bit、srf之类的变量定义在教科书中是找不到的,...
MFC中封装了大部分Windows API函数和Windows控件,它包含的功能涉及到整个Windows操作系统。MFC不仅给用户提供了Windows图形环境下应用程序的框架,而且还提供了创建应用程序的组件,这样,开发人员不必从头设计创建...
Qt良好的封装机制使得Qt的模块化程度非常高,可重用性较好,对用户开发来货是非常方便的。Qt提供一种为signals/slots(信号和槽) 的安全类型来替代callback,使得各个元件之间的协同工作变得十分简单。 丰富的API ...
5.9 读取二进制数据到可变缓冲区中 5.10 内存映射的二进制文件 5.11 文件路径名的操作 5.12 测试文件是否存在 5.13 获取文件夹中的文件列表 5.14 忽略文件名编码 5.15 打印不合法的文件名 5.16 增加或改变已...
11.5 你会设计带有可变参数的宏吗? 19 11.6 你知道使用宏有什么劣势吗? 20 11.7 你有没有更好的替代方案? 20 11.8 为什么说宏定义不好? 21 12 如何避免对同一头文件的多次include? 22 13 什么是声明,什么是定义...
Qt良好的封装机制使得Qt的模块化程度非常高,可重用性较好,对用户开发来货是非常方便的。Qt提供一种为signals/slots(信号和槽) 的安全类型来替代callback,使得各个元件之间的协同工作变得十分简单。 丰富的API ...
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...
Qt良好的封装机制使得Qt的模块化程度非常高,可重用性较好,对用户开发来货是非常方便的。Qt提供一种为signals/slots(信号和槽) 的安全类型来替代callback,使得各个元件之间的协同工作变得十分简单。 丰富的API ...