📜  C++可变关键字(1)

📅  最后修改于: 2023-12-03 15:14:04.182000             🧑  作者: Mango

C++可变关键字

简介

C++11引入了可变关键字(variadic keyword),使得函数可以接受任意数量的参数。这种函数又被称为可变参数函数(variadic function)。

可变关键字的语法使用了省略号(...),用于指示参数数量不定。可变参数函数的最后一个明确指定的参数后面跟着省略号,表示接受任意数量的参数。当调用可变参数函数时,在最后一个明确指定的参数后面,用逗号分隔所有额外的参数。

举个例子,下面是一个简单的可变参数函数:

#include <iostream>
#include <stdarg.h>

int sum(int count, ...) {
    va_list args;
    va_start(args, count);

    int result = 0;
    for (int i = 0; i < count; i++) {
        result += va_arg(args, int);
    }

    va_end(args);
    return result;
}

int main() {
    std::cout << sum(3, 1, 2, 3) << std::endl;
}

这个函数接受一个整数 count 和任意数量的整数参数。在函数内部,我们使用了 <stdarg.h> 头文件中的 va_listva_startva_argva_end 函数处理可变数量的参数。

使用

可变参数函数在很多地方都可以用到,例如:printf、scanf、fopen 等。

下面我们写一个例子,用可变参数函数来实现一个简易的 printf 函数:

#include <iostream>
#include <stdarg.h>

void my_printf(const char* format, ...) {
    va_list args;
    va_start(args, format);

    char ch;
    while (*format) {
        if (*format == '%') {
            format++;
            switch (*format) {
                case 'd': {
                    int num = va_arg(args, int);
                    std::cout << num;
                    break;
                }
                case 's': {
                    char* str = va_arg(args, char*);
                    std::cout << str;
                    break;
                }
                default:
                    break;
            }
        } else {
            std::cout << *format;
        }
        format++;
    }

    va_end(args);
}

int main() {
    my_printf("Hello, world!\n");

    int a = 1, b = 2, c = 3;
    my_printf("a + b + c = %d\n", a + b + c);

    char str[] = "World";
    my_printf("Hello, %s\n", str);

    return 0;
}

我们在函数中使用了 va_arg 函数来从可变参数列表获取指定类型的参数,并进行相应的处理。

注意事项

使用可变参数函数需要注意以下几点:

  • 可变参数函数的最后一个明确指定的参数后面一定要加上省略号。
  • 调用可变参数函数时要注意传递参数的类型和数量。
  • 在使用 va_arg 获取参数之前,要调用 va_start 函数进行初始化,以防内存错误。
  • 在调用完可变参数函数后,要及时调用 va_end 函数清理资源。
总结

可变关键字是 C++ 中实用而强大的特性之一,允许我们编写更加灵活的函数。掌握可变参数函数的用法和注意事项,可以为我们开发更高效、更易用的代码提供帮助。