that in C. The only difference is in the syntax, where the comma before the ellipsis can be omitted. C++ allows variadic functions without named parameters but provides no way to access those arguments since va_start requires the name of the last fixed argument of the function. #include <iostream> #include <cstdarg> void simple_printf(const char* fmt...) // C-style "const char* fmt, ..." is also valid { 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); } Variadic templates (parameter pack) can also be used in C++ with language built-in fold expressions. #include <iostream> template <typename... Ts> void foo_print(Ts... args) { ((std::cout << args << ' '), ...); } int main() { std::cout << std::boolalpha; foo_print(1, 3.14f); // 1 3.14 foo_print("Foo", 'b', true, nullptr); // Foo b true nullptr } The CERT Coding Standards for C++ strongly prefers the use of variadic templates (parameter pack) in C++ over the C-style variadic function due to a lower risk of misuse. In Go Variadic functions in Go can be called with any number of trailing arguments. is a common variadic function; it uses an empty interface as a catch-all type. package main import "fmt" // This variadic function takes an arbitrary number of ints as arguments. func sum(nums ...int) { fmt.Print("The sum of ", nums) // Also a variadic function. total := 0 for _, num := range nums { total += num } fmt.Println(" is", total) // Also a variadic function. } func main() { // Variadic functions can be called in the usual way with individual // arguments. sum(1, 2) // "The sum of [1 2] is 3" sum(1, 2, 3) // "The sum of [1 2 3] is 6" // If you already have multiple args in a slice, apply them to a variadic // function using func(slice...) like this. nums := []int{1, 2, 3, 4} sum(nums...) // "The sum of [1 2 3 4] is 10" } Output: The sum of [1 2] is 3 The sum of [1 2 3]