Warning: file_get_contents(https://whois.pconline.com.cn/jsLabel.jsp?ip=127.0.0.1) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.1 503 Service Temporarily Unavailable in D:\wwwroot\huidong\wwwroot\function.inc.php on line 884
关于函数可变参的问题 - huidong

huidong

首页 | 会员登录 | 关于争取 2022 寒假做出汇东网 Ver3.0.0 !
搜索文章


创建可变参函数

void func(const char* _Format, ...)

... 表示可变参


读取每个可变参

像这样创建一个可变参列表……

// 可变参列表
va_list list;


然后通过va_start宏开始读取可变参

va_start(list, _Format);


再用va_arg宏获取每个可变参的值

下面就读取了第一个可变参的值,若再执行一次,读取到的就是第二个可变参的值。

这个宏的第二个参数是返回的变量类型。

double d = va_arg(list, double);


读取完毕后,通过 va_end宏结束读取可变参

va_end(list);


可以将可变参传入到 sprintf 等带有可变参的函数中吗?

貌似不行,除非有专门支持传入可变参列表的函数,如vsprintf_s,它的原型:

int __CRTDECL vsprintf_s(
            _Out_writes_(_BufferCount) _Always_(_Post_z_) char*       const _Buffer,
            _In_                                          size_t      const _BufferCount,
            _In_z_ _Printf_format_string_                 char const* const _Format,
                                                          va_list           _ArgList
            )



可以看到,第四个形参是可变参数列表,我们可以通过这个函数传入可变参列表:

char str[32] = { 0 };

vsprintf_s(str, 30, _Format, list);


完整的例子

#include <stdio.h>
#include <Windows.h>

void MyPrint(const char* _Format, ...)
{
    // 可变参列表
    va_list list;

    // 开始读取可变参
    va_start(list, _Format);

    char str[32] = { 0 };

    vsprintf_s(str, 30, _Format, list);

    // 结束读取可变参
    va_end(list);

    sprintf_s(str, 30, "%s - from MyPrint", str);
    printf("%s", str);
}

int main()
{
    int i = 1 + 3;
    MyPrint("1+3 = %d", i);
    while (true);

    return 0;
}


图片.png



返回首页


Copyright (C) 2018-2024 huidong