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测试的更多相关文章

  1. [问题记录]Java关于可变参数重载问题的测试

    突然发现java的可变参数重载是存在歧义的,只是不知道java内部是怎么处理的,特意做如下实验: 测试代码如下: /** * Created by ieayoio on 16-3-1. */ publ ...

  2. 压力测试(三)-自定义变量和CSV可变参数实操

    1.Jmeter用户自定义变量实战 简介:什么是用户自定义变量,怎样使用 为什么使用:很多变量在全局中都有使用,或者测试数据更改,可以在一处定义,四处使用 比如服务器地址 1.线程组->add ...

  3. 可变参数宏__VA_ARGS__和...

    __VA_ARGS__ 是一个可变参数的宏(gcc支持).实现思想就是宏定义中参数列表的最后一个参数为省略号(也就是三个点).这样预定义宏_ _VA_ARGS_ _就可以被用在替换部分中,替换省略号所 ...

  4. C语言可变参数函数实现原理

    一.可变参数函数实现原理 C函数调用的栈结构: 可变参数函数的实现与函数调用的栈结构密切相关,正常情况下C的函数参数入栈规则为__stdcall, 它是从右到左的,即函数中的最右边的参数最先入栈. 本 ...

  5. java可变参数例子:求学生成绩信息,不确定课程数

    可变参数特点: 1)...只能出现在参数列表的最后2)...位于变量类型和变量名之间3)调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数 //可变参数也可用 ...

  6. javaweb学习总结二(静态导入、自动拆装箱、增强for与可变参数)

    一:静态导入语法:import static 导入类.成员变量|成员方法那么在代码中可以直接使用变量或者方法,而不需要通过类名.来调用 静态导入: import static java.lang.Sy ...

  7. 【转载】va_list 可变参数 简介 va_copy vprintf

    [说明]本文转载自 smart 的文章 http://blog.sina.com.cn/s/blog_590be5290100qhxr.html  及百度百科 va_list是一个宏,由va_star ...

  8. C语言中函数可变参数解析

    大多数时候,函数中形式参数的数目通常是确定的,在调用时要依次给出与形式参数对应的所有实际参数.但在某些情况下希望函数的参数个数可以根据需要确定.典型的例子有 大家熟悉的函数printf().scanf ...

  9. Effective Java 第三版——32.合理地结合泛型和可变参数

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

随机推荐

  1. 纯Java增删改查

    //自己写的一个完整的带增删改查提交重置功能的表单代码.package com.l16.test5;import java.awt.Color;import java.awt.Container;im ...

  2. php 获取文件后缀

    /** * 获取文件后缀 * $path 本地存储临时文件路径 * */ private function getFileType($path){ $fp=fopen($path,'r'); $bin ...

  3. Python3 离线安装TensorFlow包

    Python3 离线安装TensorFlow包 1,下载包 官网地址:https://pypi.org/project/tensorflow/1.1.0rc2/#files 清华镜像:https:// ...

  4. 错误 1 error LNK2019: 无法解析的外部符号 __imp__pthread_create,该符号在函数 _main 中被引用 解决方法

    晚上花几分钟在windows下测了下pthread的用法,出现错误 1 error LNK2019: 无法解析的外部符号 __imp__pthread_create,该符号在函数 _main 中被引用 ...

  5. 20145315何佳蕾《网络对抗》Web安全基础

    20145315何佳蕾<网络对抗>Web安全基础 1.实验后回答问题 (1)SQL注入攻击原理,如何防御 SQL Injection:就是通过把SQL命令插入到Web表单递交或输入域名或页 ...

  6. mysqladmin 使用

    1.第一次没有密码 mysqladmin -u root -p password aook 2.已经有密码的情况下 mysqladmin -u root -paook password aook**0 ...

  7. oracle a:=100 和 b=:c 区别

    a:=100  是赋值语句 b=:c  :c是一个整体,表示一个参数.

  8. Bootstrap3基础 pagination 分页按钮 简单示例

      内容 参数   OS   Windows 10 x64   browser   Firefox 65.0.2   framework     Bootstrap 3.3.7   editor    ...

  9. Python3 tkinter基础 Canvas coords 移动直线,itemconfig 设置矩形的颜色, delete 删除一条直线

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  10. 2015,3,10 1(南阳理工ACM)

    描述输入三个字符(可以重复)后,按各字符的ASCII码从小到大的顺序输出这三个字符.   输入 第一行输入一个数N,表示有N组测试数据.后面的N行输入多组数据,每组输入数据都是占一行,有三个字符组成, ...