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年出版,到现在已经将 ...
随机推荐
- 纯Java增删改查
//自己写的一个完整的带增删改查提交重置功能的表单代码.package com.l16.test5;import java.awt.Color;import java.awt.Container;im ...
- php 获取文件后缀
/** * 获取文件后缀 * $path 本地存储临时文件路径 * */ private function getFileType($path){ $fp=fopen($path,'r'); $bin ...
- Python3 离线安装TensorFlow包
Python3 离线安装TensorFlow包 1,下载包 官网地址:https://pypi.org/project/tensorflow/1.1.0rc2/#files 清华镜像:https:// ...
- 错误 1 error LNK2019: 无法解析的外部符号 __imp__pthread_create,该符号在函数 _main 中被引用 解决方法
晚上花几分钟在windows下测了下pthread的用法,出现错误 1 error LNK2019: 无法解析的外部符号 __imp__pthread_create,该符号在函数 _main 中被引用 ...
- 20145315何佳蕾《网络对抗》Web安全基础
20145315何佳蕾<网络对抗>Web安全基础 1.实验后回答问题 (1)SQL注入攻击原理,如何防御 SQL Injection:就是通过把SQL命令插入到Web表单递交或输入域名或页 ...
- mysqladmin 使用
1.第一次没有密码 mysqladmin -u root -p password aook 2.已经有密码的情况下 mysqladmin -u root -paook password aook**0 ...
- oracle a:=100 和 b=:c 区别
a:=100 是赋值语句 b=:c :c是一个整体,表示一个参数.
- Bootstrap3基础 pagination 分页按钮 简单示例
内容 参数 OS Windows 10 x64 browser Firefox 65.0.2 framework Bootstrap 3.3.7 editor ...
- Python3 tkinter基础 Canvas coords 移动直线,itemconfig 设置矩形的颜色, delete 删除一条直线
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- 2015,3,10 1(南阳理工ACM)
描述输入三个字符(可以重复)后,按各字符的ASCII码从小到大的顺序输出这三个字符. 输入 第一行输入一个数N,表示有N组测试数据.后面的N行输入多组数据,每组输入数据都是占一行,有三个字符组成, ...