C/C++学习——不定参数

C语言中的不定参数

定义:在C语言中,可以使用不定参数函数(variadic functions)来处理可变数量的参数。这些函数可以接受不定数量的参数,并且在函数内部可以使用一些特殊的宏来访问这些参数。

在C语言中,不定参数通常与标准库中的头文件一起使用,以下是一些关键的宏和函数,用于处理不定参数函数:

    va_list:va_list是一个类型,用于定义一个指向参数列表的对象。通常会在函数中声明一个va_list对象来处理可变参数。

    va_start:va_start宏用于初始化va_list对象,使其指向参数列表的第一个参数。

    va_arg:va_arg宏用于从参数列表中获取下一个参数的值。需要提供参数的类型作为第二个参数。

    va_end:va_end宏用于关闭va_list对象,以便系统可以释放相应的资源。

以下是一个简单示例:

/*不定参宏函数的使用*/
#define _GNU_SOURCE
#include 
#include 
#include 


#define LOG(fmt, ...) printf("[%s:%d]" fmt, __FILE__, __LINE__, ##__VA_ARGS__);

void printNum(int count, ...) //C语言中不定参函数的使用
{
    va_list ap;
    va_start(ap, count); //获取指定参数的起始地址,获取count参数之后的第一个参数的地址
    for (int i = 0; i < count; i++)
    {
        int num = va_arg(ap, int);
        printf("param[%d]:%d\n", i ,num);
    }
    va_end(ap); //将ap指针置空
}

void myprintf(const char *fmt, ...)
{
    va_list ap; //定义一个va_list对象
    va_start(ap, fmt);
    char *res;
    int ret = vasprintf(&res, fmt, ap);
    if(ret != -1)
    {
        printf(res);
        free(res); //释放内存
    }
    va_end(ap); //将ap指针置空
}

int main()
{
    LOG("比特就业课");
    printNum(5, 3,4,6,7,8);
    myprintf("%s-%d", "比特就业课", 666);
    myprintf("%s-%d", "比特就业课");
    return 0;
}

C++中的不定参数

在C++中,可以使用可变参数模板(variadic templates)来处理不定数量的参数。C++11引入了这一功能,允许编写可以接受任意数量参数的函数或类模板,可变参数模板使用递归展开技术来处理参数列表。

以下是一个示例代码:

#include 
/*
C++不定参函数使用
*/
void xprintf()
{
    std::cout << std::endl;
}

template<typename T, typename ...Args> //函数模版
void xprintf(const T &v, Args &&...args)
{
    std::cout << v;
    if((sizeof ...(args)) > 0)
    {
        xprintf(std::forward<Args>(args)...); //递归调用
    }
    else
    {
        xprintf(); //调用无参函数
    }

}

int main()
{
    xprintf("比特");
    xprintf("比特","就业课");
    xprintf("比特","结业课",666);

    return 0;
}

C++的可变参数模板非常强大,可以用于各种情况,包括实现通用的函数和类,以处理不定数量和类型的参数。这在编写泛型代码时非常有用。

你可能感兴趣的:(c++)