C++.可变参数_ZC测试
ZC:环境: Win7 x64(旗舰版),Microsoft Visual Studio 2010(版本 10.0.30319.1 RTMRel, Microsoft .NET Framework(版本 4.0.30319 RTMRel))
1、代码:
#include <stdio.h>
#include <stdarg.h>
#include <windows.h> int sum(int count, ...);//原型中使用省略号 // 函数的参数为:DWORD _dw, HWND _h, char* _pc
void TextZ(int _n, ...)// ZC: 貌似无法动态获得参数的个数,∴只能在参数中带上参数的个数(需要的话),我一般放在可变参数前面的位置。
{
va_list ap;//声明一个va_list变量
va_start(ap, _n);//初始化,第二个参数为最后一个确定的形参// ZC: 需要 参数个数 作为函数va_start(...)的参数 // ZC: 貌似参数只能依次取,不能随机取?
DWORD dw = va_arg(ap, DWORD);//读取可变参数,的二个参数为可变参数的类型
HWND h = va_arg(ap, HWND);
char* pc = va_arg(ap, char*); va_end(ap);//清理工作 // *** printf("DWORD : %d, HWND : %d, char* : %s\n", dw, h, pc);
} // 下面的函数 和 上面的函数 几乎一模一样,只是这里是使用 指针来取得可变参数,这里是尝试其可行性
void TextZ01(int _n, ...)// ZC: 貌似无法动态获得参数的个数,∴只能在参数中带上参数的个数(需要的话),我一般放在可变参数前面的位置。
{
va_list ap;//声明一个va_list变量
va_start(ap, _n);//初始化,第二个参数为最后一个确定的形参// ZC: 需要 参数个数 作为函数va_start(...)的参数 // ZC: 貌似参数只能依次取,不能随机取?
DWORD* pdw = &va_arg(ap, DWORD);//读取可变参数,的二个参数为可变参数的类型
HWND* ph = &va_arg(ap, HWND);
char** ppc = &va_arg(ap, char*); va_end(ap);//清理工作 // *** printf("DWORD : %d, HWND : %d, char* : %s\n", *pdw, *ph, *ppc);
} void main()
{
//int i = sum(3, 4,5,6);
//printf("sum : %d\n", i); TextZ(, , , "TextZ");
TextZ01(, , , "TextZ");
system("pause");
} // *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** int sum(int count, ...)//count 表示可变参数个数
{
va_list ap;//声明一个va_list变量
va_start(ap, count);//初始化,第二个参数为最后一个确定的形参 int sum = ;
for(int i = ; i < count; i++)
sum += va_arg(ap, int);//读取可变参数,的二个参数为可变参数的类型 va_end(ap);//清理工作
return sum;
}
2、控制台输出:

3、
4、自己的包装函数(1)
ZC:主要是在 函数内部去使用 sprintf_s(...) 来组合字符串,省的写在外面(写在外面 代码太多太乱 看不清晰)
ZC:下面,函数传入的可变参数 都是 DWORD类型的,如果需要 不同的类型的话,可以在可变参数中加入指定参数类型的参数,见下面的"5"
void ShowMsg_Thread_DLL_VA_DWORD(char* _pc, int _n, ...)
{
if (g_fnShowMsg_Thread == NULL)
return;
if (_n > )
{
::MessageBoxA(, "Parameter count not enough .", "ShowMsg_Thread_DLL_VA_DWORD", );
return;
} DWORD dws[] = {};
char buf[] = {}; va_list ap;
va_start(ap, _n); if (_n == )
g_fnShowMsg_Thread(_pc);
else if (_n == )
{
dws[] = va_arg(ap, DWORD);
sprintf_s(buf, sizeof(buf), _pc, dws[]);
}
else if (_n == )
{
for (int i=; i<_n; i++)
dws[] = va_arg(ap, DWORD);
sprintf_s(buf, sizeof(buf), _pc, dws[], dws[]);
}
else if (_n == )
{
for (int i=; i<_n; i++)
dws[] = va_arg(ap, DWORD);
sprintf_s(buf, sizeof(buf), _pc, dws[], dws[], dws[]);
}
else if (_n == )
{
for (int i=; i<_n; i++)
dws[] = va_arg(ap, DWORD);
sprintf_s(buf, sizeof(buf), _pc, dws[], dws[], dws[], dws[]);
}
else if (_n == )
{
for (int i=; i<_n; i++)
dws[] = va_arg(ap, DWORD);
sprintf_s(buf, sizeof(buf), _pc, dws[], dws[], dws[], dws[], dws[]);
} va_end(ap);
g_fnShowMsg_Thread(buf);
}
5、自己的包装函数(2)
ZC:函数传入的可变参数,如果需要是 不同的类型的话,可以在可变参数中加入指定参数类型的参数,例如 我在 D?SvgExe的D?RemoteCall代码中的使用方式
6、
7、(20191112)Qt598x64(vs2017) 编译的"Widgets Application"中 printf(...)和fprintf(...)调用后,不会立即在控制台输出信息,需要调用"fflush(stdout);"后 信息才会显示出来,于是就想 封装一个信息打印的函数 在函数中直接调用 fflush(...),这就需要 封装成可变参数的函数,于是查了资料,封装成这样:
#include <stdarg.h> void MsgPrint(const char *format, ...)
{
va_list ap;
int n; va_start(ap, format);
n = vprintf(format, ap);
va_end(ap);
//return n; // ZC: 上面是 printf(...)的实现
fflush(stdout);// Qt598不执行这一句的话 print(...)和fprintf(stdout, ...)输出的信息 不会立即显示在"应用程序输出"中
}
(1)va_list 、va_start、 va_arg、 va_end 使用说明 - 土戈 - CSDN博客.html(https://blog.csdn.net/f110300641/article/details/83822290)
// 附:可变参数应用实例 // 1.printf实现 #include <stdarg.h> int printf(char *format, ...)
{
va_list ap;
int n; va_start(ap, format);
n = vprintf(format, ap);
va_end(ap);
return n;
} // 2.定制错误打印函数error #include <stdio.h>
#include <stdarg.h> void error(char *format, ...)
{
va_list ap;
va_start(ap, format);
fprintf(stderr, "Error: ");
vfprintf(stderr, format, ap);
va_end(ap);
fprintf(stderr, "\n");
return;
}
8、
9、
C++.可变参数_ZC测试的更多相关文章
- [问题记录]Java关于可变参数重载问题的测试
突然发现java的可变参数重载是存在歧义的,只是不知道java内部是怎么处理的,特意做如下实验: 测试代码如下: /** * Created by ieayoio on 16-3-1. */ publ ...
- 压力测试(三)-自定义变量和CSV可变参数实操
1.Jmeter用户自定义变量实战 简介:什么是用户自定义变量,怎样使用 为什么使用:很多变量在全局中都有使用,或者测试数据更改,可以在一处定义,四处使用 比如服务器地址 1.线程组->add ...
- 可变参数宏__VA_ARGS__和...
__VA_ARGS__ 是一个可变参数的宏(gcc支持).实现思想就是宏定义中参数列表的最后一个参数为省略号(也就是三个点).这样预定义宏_ _VA_ARGS_ _就可以被用在替换部分中,替换省略号所 ...
- C语言可变参数函数实现原理
一.可变参数函数实现原理 C函数调用的栈结构: 可变参数函数的实现与函数调用的栈结构密切相关,正常情况下C的函数参数入栈规则为__stdcall, 它是从右到左的,即函数中的最右边的参数最先入栈. 本 ...
- java可变参数例子:求学生成绩信息,不确定课程数
可变参数特点: 1)...只能出现在参数列表的最后2)...位于变量类型和变量名之间3)调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数 //可变参数也可用 ...
- javaweb学习总结二(静态导入、自动拆装箱、增强for与可变参数)
一:静态导入语法:import static 导入类.成员变量|成员方法那么在代码中可以直接使用变量或者方法,而不需要通过类名.来调用 静态导入: import static java.lang.Sy ...
- 【转载】va_list 可变参数 简介 va_copy vprintf
[说明]本文转载自 smart 的文章 http://blog.sina.com.cn/s/blog_590be5290100qhxr.html 及百度百科 va_list是一个宏,由va_star ...
- C语言中函数可变参数解析
大多数时候,函数中形式参数的数目通常是确定的,在调用时要依次给出与形式参数对应的所有实际参数.但在某些情况下希望函数的参数个数可以根据需要确定.典型的例子有 大家熟悉的函数printf().scanf ...
- Effective Java 第三版——32.合理地结合泛型和可变参数
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
随机推荐
- 每日linux命令学习-sed
Linux的文本处理实用工具主要由sed和awk命令,二者虽然略有差异,但都使用正则表达式,默认使用标准I/O,并且使用管道命令可以将前一个命令的输出作为下一个命令的输入.笔者将在本节学习sed命令. ...
- 4~20mA
4~20mA电流输出芯片XTR111完整电路 0-5v转0-20ma和0-5v转4-20ma 压控恒流源电路 4-20mA电流环路发送器入门
- Eloquent JavaScript #03# functions
索引: let VS. var 定义函数的几种方式 more... 1.作者反复用的side effect side effect就是对世界造成的改变,例如说打印某些东西到屏幕,或者以某种方式改变机器 ...
- javax.servlet.ServletException: Servlet.init() for servlet springmvc threw exception
type Exception report message Servlet.init() for servlet springmvc threw exception description The s ...
- django自定义错误响应
在做一个web时,总是会出现各种错误,如400.403.404.500等.一般开发都要做对应的处理,给一些友好提示,或返回一些公益广告等. 在Django中,默认提供了常见的错误处理方式,比如: ha ...
- iframe跨域问题:Uncaught DOMException: Blocked a frame with origin解决方法
在前后端分离的情况下,前台页面将后台页面加载在预留的iframe中:但是遇到了iframe和主窗口双滚动条的情况,由此引申出来了问题: 只保留单个滚动条,那么就要让iframe的高度自适应,而从主页面 ...
- 02: git分支管理
目录:GIT其他篇 01: git & github 02: git分支管理 目录: 1.1 Git常用命令 1.2 主要分支(保护分支) 1.3 特性分支:feature (开发分支合并到d ...
- Oracle redo/undo 原理理解
一. 什么是redo(用于重做数据) redo也就是重做日志文件(redo log file),Oracle维护着两类重做日志文件:在线(online)重做日志文件和归档(archived)重做日志文 ...
- zynq基础-->linux下软件应用
操作系统:Ubuntu 16.04 LTS 应用软件:Vivado 2016.2 + petalinux 2016.2 参考官方应用手册:ug1144-petalinux-tools-referen ...
- 转载:索引与分片 plus
[Python笔记]序列(一)索引.分片 Python包含6种内建序列:列表.元组.字符串.Unicode字符串.buffer对象.xrange对象.这些序列支持通用的操作: 索引 索引是从0开始 ...