Namespaces
Variants
Views
Actions

Difference between revisions of "c/variadic"

From cppreference.com
< c
m (link variadic)
m (See also: nomono, langlinks)
 
(5 intermediate revisions by 3 users not shown)
Line 4: Line 4:
 
Variadic functions are functions (e.g. {{lc|printf}}) which take a variable number of arguments.
 
Variadic functions are functions (e.g. {{lc|printf}}) which take a variable number of arguments.
  
The declaration of a variadic function uses an ellipsis as the last parameter, e.g. {{c|int printf(const char* format, ...);}}. See [[c/language/variadic|variadic functions]] for additional detail on the syntax and automatic argument conversions.
+
The declaration of a variadic function uses an ellipsis as the last parameter, e.g. {{c|int printf(const char* format, ...);}}. See [[c/language/variadic|variadic arguments]] for additional detail on the syntax and automatic argument conversions.
  
 
Accessing the variadic arguments from the function body uses the following library facilities:
 
Accessing the variadic arguments from the function body uses the following library facilities:
  
 
{{dsc begin}}
 
{{dsc begin}}
{{dsc header | stdarg.h}}
 
 
{{dsc h2 | Macros}}
 
{{dsc h2 | Macros}}
 +
{{dsc header | stdarg.h}}
 
{{dsc inc | c/variadic/dsc va_start}}
 
{{dsc inc | c/variadic/dsc va_start}}
 
{{dsc inc | c/variadic/dsc va_arg}}
 
{{dsc inc | c/variadic/dsc va_arg}}
Line 27: Line 27:
 
#include <stdarg.h>
 
#include <stdarg.h>
 
   
 
   
void simple_printf(const char* fmt,...)
+
void simple_printf(const char* fmt, ...)
 
{
 
{
 
     va_list args;
 
     va_list args;
Line 37: Line 37:
 
             printf("%d\n", i);
 
             printf("%d\n", i);
 
         } else if (*fmt == 'c') {
 
         } else if (*fmt == 'c') {
             // note automatic conversion to integral type
+
             // A 'char' variable will be promoted to 'int'
 +
            // A character literal in C is already 'int' by itself
 
             int c = va_arg(args, int);
 
             int c = va_arg(args, int);
 
             printf("%c\n", c);
 
             printf("%c\n", c);
Line 60: Line 61:
 
42.50000
 
42.50000
 
}}
 
}}
 +
 +
===References===
 +
{{ref std c11}}
 +
{{ref std | section=7.16 | title=Variable arguments <stdarg.h> | p=269-272}}
 +
{{ref std c99}}
 +
{{ref std | section=7.15 | title=Variable arguments <stdarg.h> | p=249-252}}
 +
{{ref std c89}}
 +
{{ref std | section=4.8  | title=VARIABLE ARGUMENTS <stdarg.h>}}
 +
{{ref std end}}
  
 
===See also===
 
===See also===
 
{{dsc begin}}
 
{{dsc begin}}
{{dsc see cpp | cpp/utility/variadic | Variadic functions}}
+
{{dsc see cpp | cpp/utility/variadic | Variadic functions | nomono=true}}
 
{{dsc end}}
 
{{dsc end}}
  
[[de:c/variadic]]
+
{{langlinks|ar|cs|de|es|fr|it|ja|ko|pl|pt|ru|tr|zh}}
[[es:c/variadic]]
+
[[fr:c/variadic]]
+
[[it:c/variadic]]
+
[[ja:c/variadic]]
+
[[pt:c/variadic]]
+
[[ru:c/variadic]]
+
[[zh:c/variadic]]
+

Latest revision as of 03:58, 23 June 2021

Variadic functions are functions (e.g. printf) which take a variable number of arguments.

The declaration of a variadic function uses an ellipsis as the last parameter, e.g. int printf(const char* format, ...);. See variadic arguments for additional detail on the syntax and automatic argument conversions.

Accessing the variadic arguments from the function body uses the following library facilities:

Contents

Macros
Defined in header <stdarg.h>
enables access to variadic function arguments
(function macro) [edit]
accesses the next variadic function argument
(function macro) [edit]
makes a copy of the variadic function arguments
(function macro) [edit]
ends traversal of the variadic function arguments
(function macro) [edit]
Type
holds the information needed by va_start, va_arg, va_end, and va_copy
(typedef) [edit]

[edit] Example

Print values of different types.

#include <stdio.h>
#include <stdarg.h>
 
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);
            printf("%d\n", i);
        } else if (*fmt == 'c') {
            // A 'char' variable will be promoted to 'int'
            // A character literal in C is already 'int' by itself
            int c = va_arg(args, int);
            printf("%c\n", c);
        } else if (*fmt == 'f') {
            double d = va_arg(args, double);
            printf("%f\n", d);
        }
        ++fmt;
    }
 
    va_end(args);
}
 
int main(void)
{
    simple_printf("dcff", 3, 'a', 1.999, 42.5); 
}

Output:

3
a
1.999000
42.50000

[edit] References

  • C11 standard (ISO/IEC 9899:2011):
  • 7.16 Variable arguments <stdarg.h> (p: 269-272)
  • C99 standard (ISO/IEC 9899:1999):
  • 7.15 Variable arguments <stdarg.h> (p: 249-252)
  • C89/C90 standard (ISO/IEC 9899:1990):
  • 4.8 VARIABLE ARGUMENTS <stdarg.h>

[edit] See also

C++ documentation for Variadic functions