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. 关于js浅拷贝与深拷贝的理解

    前端开发中,一般情况下,很少会去在意深拷贝与浅拷贝的关系. 大家知道,js变量有2种数据类型:基本类型和引用类型.基本类型的拷贝是将整个值完全拷贝一份的,也就是深拷贝.就是开辟了新的堆内存.所以基本类 ...

  2. Solr在Linux中的安装

    在Linux下进行安装: 我已经将压缩包放在了虚拟机下面了,然后开始进行解压缩. tar -zxvf solr-4.10.3.tar 解压完会多一个文件夹.在bin目录下会有这样的一个目录, 其中的这 ...

  3. sql 思路

    先 django 定好sql框架 再 sqlalchemy 根据框架写...

  4. sqlalchemy 多对多关系

    # -*- coding: utf-8 -*- from sqlalchemy import Column, String, create_engine,ForeignKey,Text,Integer ...

  5. Linux查看机器和硬盘的SN

    查看硬件RAID中某块硬盘SN # sas 口: [root@ ~]$ smartctl -a /dev/sda -d megaraid,n *** Serial number: 6RJ974SR * ...

  6. Golang内存分配内置函数之new函数

    new函数用来分配内存,主要分配值类型,比如int.float32.struct等,返回的是指针 package main import ( "fmt" ) func main() ...

  7. mysql配置主从复制和常见问题

    克隆192.168.138.130(主库),修改后的ip为192.168.138.130(从库),修改131机器的/etc/udev/rules.d/70-persistent-net.rules,将 ...

  8. mysql常用的操作命令

    在mysql中以半角分号;作为命令的结束符 查看当前系统包含的数据库:mysql> show databases [like ' ']; 从一个数据库切换到另一个:mysql>use ol ...

  9. rman备份例子

    1.全备份例子 #!/bin/sh RMAN_OUTPUT_LOG=/home/oracle/rman_output.logRMAN_ERROR_LOG=/home/oracle/rman_error ...

  10. 20165211 2017-2018-2 《Java程序设计》课程总结

    20165211 2017-2018-2 <Java程序设计>课程总结 一.每周作业及实验报告博客链接汇总 预备作业1:我期望的师生关系 预备作业2:学习基础和C语言调查 预备作业3:Li ...