zoukankan      html  css  js  c++  java
  • c语言解决函数变参数问题 va_list

    前言:
    看到sprintf,swprintf之类的可变参数格式化函数,是否想过我们能写一个自定义的类似的函数吗?答案是很定的,下面来介绍一种方法,用va_list,va_start, va_end来实现。
           va_list是一个宏,使用的时候先定义一个变量,然后用va_start来初始化,使用完后用va_end来结束。使用时我们可以分析每一个参数,这时要使用va_argc,但是没有方法知道有多少个参数。所以可以简单的将参数格式化输出到一个缓冲区里,需要使用函数vsprintf。

    举一个简单的小例子:

    #include "stdafx.h"
    #include <Windows.h>
    
    void varPrint(char *format, ...)
    {
    	va_list va;          //定义变量
    	va_start(va, format); //初始化变量
    	char szMsg[0x30] = { 0 };
            //简单的将消息输出到缓冲区里,返返回的是缓冲区的字符个数,不包括''
            int nCount = vsnprintf_s(szMsg, sizeof(szMsg), sizeof(szMsg)-sizeof(char), format, va);
      
    	int argc1 = va_arg(va, int);//第一个参数为va_list变量,第二个参数为要返回的数据类型
    	int argc2 = va_arg(va, int);//。。。。。。。。
    	int argc3 = va_arg(va, int);
    
    	va_end(va);//最后释放资源
    	printf_s("result:%s", szMsg);
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	SYSTEMTIME sysTime = { 0 };
    	CHAR szMsg[512] = { 0 };
    	GetLocalTime(&sysTime);
           //这里的格式化信息将在调用中输出
    	varPrint("Msg:%d-%d-%d %d", sysTime.wYear, sysTime.wMonth, sysTime.wDay, sysTime.wDayOfWeek);
    	getchar();
    	return 0;
    
    }
    
  • 相关阅读:
    菜鸟浅谈软件开发项目管理
    中国准货币体系的概要简析
    使用dockercompose安装wordpress
    货币乘数
    安全测试的相关内容
    TCP三次握手和四次挥手
    HTTP协议相关
    描述浏览器登录的过程
    AJAX相关知识
    什么是热钱
  • 原文地址:https://www.cnblogs.com/priarieNew/p/9756353.html
Copyright © 2011-2022 走看看