匯東網


关于函数可变参的问题

[編輯] [转简体]
|
作者:huidong | 分類:【編程】C/C++
[ 8 瀏覽 0 評論 1 贊 1 踩 ]

概要
如何创建为函数可变参数的问题……

正文

创建可变参函数

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;
}

[ 1] [ 1]


 評論區  0 條評論

+ 添加評論