Variadic functions

来自cppreference.com
< cpp‎ | utility

 
 
实用工具库
类型的支持 (basic types, RTTI, type traits)
动态内存管理
错误处理
程序实用工具
可变参数函数
日期和时间
函数对象
initializer_list(C++11)
bitset
hash(C++11)
关系运算符
原文:
Relational operators
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
rel_ops::operator!=
rel_ops::operator>
rel_ops::operator<=
rel_ops::operator>=
双和元组
原文:
Pairs and tuples
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
pair
tuple(C++11)
piecewise_construct_t(C++11)
piecewise_construct(C++11)
掉期,远期和移动
原文:
Swap, forward and move
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
swap
forward(C++11)
move(C++11)
move_if_noexcept(C++11)
declval(C++11)
 
 
可变参数函数是一个可变数目的参数(例如std::printf).
原文:
Variadic functions are functions (e.g. std::printf) which take a variable number of arguments.
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里

目录

[编辑] 用法

要声明一个可变参数函数,省略号作为最后一个参数,例如: int printf(const char *format, ...);。通过一个可变参数的函数的参数,可以使用下面的宏和类型的访问
原文:
To declare a variadic function, an ellipsis is used as the last parameter, e.g. int printf(const char *format, ...);. Parameters passed to a variadic function can be accessed using the following macros and types:
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
在头文件 <cstdarg> 中定义
带可变参数函数的参数可以访问
原文:
enables access to variadic function arguments
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里

(函数宏) [edit]
访问下一个可变参数函数的参数
原文:
accesses the next variadic function argument
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里

(函数宏) [edit]
(C++11)
makes a copy of the variadic function arguments
(函数宏) [edit]
结束遍历可变参数函数的参数
原文:
ends traversal of the variadic function arguments
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里

(函数宏) [edit]
持有所需的信息,由va_start中,va_arg时,va_end,并va_copy
原文:
holds the information needed by va_start, va_arg, va_end, and va_copy
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里

(类) [edit]

[编辑] 默认的转换

当一个可变参数函数被调用后,左值,右值,数组,指针,函数指针转换,每个参数是可变参数列表的一部分进行额外的转换被称为“默认参数促销” ',
原文:
When a variadic function is called, after lvalue-to-rvalue, array-to-pointer, and function-to-pointer 转换, each argument that is a part of the variable argument list undergoes additional conversions known as default argument promotions:
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
  • std::nullptr_t转换void*
    原文:
    std::nullptr_t is converted to void*
    这段文字是通过 Google Translate 自动翻译生成的。
    您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
  • float参数被转换为double浮点推广
    原文:
    float arguments are converted to double as in 浮点推广
    这段文字是通过 Google Translate 自动翻译生成的。
    您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
  • boolcharshortint,无作用域的枚举转换为整型提升或更广泛的整数类型
    原文:
    bool, char, short, and unscoped enumerations are converted to int or wider integer types as in 整型提升
    这段文字是通过 Google Translate 自动翻译生成的。
    您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
只有算术,枚举,指针,指向成员和允许类的类型参数.
原文:
Only arithmetic, enumeration, pointer, pointer to member, and class type arguments are allowed.
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里

[编辑] 替代品

  • 可变参数模板,也可用于创建功能,采取可变数目的参数。他们往往是更好的选择,因为他们不限制类型的参数,不执行整数和浮点的促销活动,并且是类型安全的。 (C++11 起)
    原文:
    Variadic templates can also be used to create functions that take variable number of arguments. They are often the better choice because they do not impose restrictions on the types of the arguments, do not perform integral and floating-point promotions, and are type safe. (C++11 起)
    这段文字是通过 Google Translate 自动翻译生成的。
    您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
  • 如果所有可变的参数都有一个共同的类型,std::initializer_list访问变量参数提供了一个方便的机制(尽管用不同的语法).
    原文:
    If all variable arguments share a common type, a std::initializer_list provides a convenient mechanism (albeit with a different syntax) for accessing variable arguments.
    这段文字是通过 Google Translate 自动翻译生成的。
    您可以帮助我们检查、纠正翻译中的错误。详情请点击这里

[编辑] 为例

#include <iostream>
#include <cstdarg>
 
void simple_printf(const char *fmt, ...)
{
    va_list args;
    va_start(args, fmt);
 
    while (*fmt != '\0') {
        if (*fmt == 'd') {
            int i = va_arg(args, int);
            std::cout << i << '\n';
        } else if (*fmt == 'c') {
            // note automatic conversion to integral type
            int c = va_arg(args, int);
            std::cout << static_cast<char>(c) << '\n';
        } else if (*fmt == 'f') {
            double d = va_arg(args, double);
            std::cout << d << '\n';
        }
        ++fmt;
    }
 
    va_end(args);
}
 
int main()
{
    simple_printf("dcff", 3, 'a', 1.999, 42.5);
}

输出:

3
a
1.999
42.5