📜  省略号 - C++ (1)

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

省略号 - C++

在 C++ 中,省略号( ... )被称为可变参数列表,它允许函数接受任意数量的参数。本文将介绍省略号的一些用法、注意事项及示例代码。

声明可变参数列表
void function_name(type1 arg1, type2 arg2, ...);

在函数声明中,省略号出现在参数列表的末尾。省略号前的参数是固定数量的,而省略号后的参数是可变数量的。

访问可变参数列表
#include <cstdarg>

void my_printf(const char* fmt, ...)
{
    va_list args;
    va_start(args, fmt);
    
    // 访问可变参数列表
    // ...
    
    va_end(args);
}

在可变参数列表中,参数的类型和数量都是未知的。为了访问这些参数,需要使用头文件 <cstdarg> 提供的宏。

  • va_list : 可变参数列表
  • va_start : 初始化可变参数列表
  • va_arg : 获取可变参数列表中的下一个参数
  • va_end : 结束可变参数列表
示例代码

下面是一个使用可变参数列表实现的打印函数 my_printf 的示例:

#include <iostream>
#include <cstdarg>

using namespace std;

void my_printf(const char* fmt, ...)
{
    va_list args;
    va_start(args, fmt);
    
    while (*fmt != '\0') {
        if (*fmt == '%') {
            fmt++;
            switch (*fmt) {
            case 'd':
                cout << va_arg(args, int);
                break;
            case 'f':
                cout << va_arg(args, double);
                break;
            case 'c':
                cout << va_arg(args, char);
                break;
            case 's':
                cout << va_arg(args, char*);
                break;
            default:
                break;
            }
        } else {
            cout << *fmt;
        }
        fmt++;
    }
    
    va_end(args);
}

int main()
{
    my_printf("Hello, %s! %d + %d = %d. %c\n", "world", 1, 2, 3, 'A');
    my_printf("PI = %f, e = %f\n", 3.1415926, 2.7182818);

    return 0;
}

该代码可以输出:

Hello, world! 1 + 2 = 3. A
PI = 3.142, e = 2.718

其中, %d 表示输出一个整数, %f 表示输出一个浮点数, %c 表示输出一个字符, %s 表示输出一个字符串。注意,在 switch 语句中必须处理所有的格式化字符,否则将会导致未定义行为。

注意事项
  • 可变参数列表必须始终由一个固定参数结束。
  • 不要省略省略号( ... )。
  • 变参函数不能进行函数重载,因为在编译器无法确定传入的参数类型和数量。
  • 变参函数不能在它们的可变参数列表中使用 register 存储类别。
  • 在某些平台上,参数穿过寄存器,因此要特别小心不要引用未能正确传递到堆栈的参数。
结论

可变参数列表为 C++ 中的函数调用带来了灵活性和可扩展性。通过合理利用函数的可变参数列表,我们可以更加轻松而灵活地处理参数。但是,在使用可变参数列表时,一定要小心,以免造成程序的崩溃、死循环、运行期错误等问题。