| External C functions are allowed to be variadic. However, a variadic function | |
| takes a minimum number of arguments. For example, consider C's variadic `printf` | |
| function: | |
| ```compile_fail,E0060 | |
| use std::os::raw::{c_char, c_int}; | |
| extern "C" { | |
| fn printf(_: *const c_char, ...) -> c_int; | |
| } | |
| unsafe { printf(); } // error! | |
| ``` | |
| Using this declaration, it must be called with at least one argument, so | |
| simply calling `printf()` is invalid. But the following uses are allowed: | |
| ```rust,edition2021 | |
| # use std::os::raw::{c_char, c_int}; | |
| # #[cfg_attr(all(windows, target_env = "msvc"), | |
| # link(name = "legacy_stdio_definitions", | |
| # kind = "static", modifiers = "-bundle"))] | |
| # extern "C" { fn printf(_: *const c_char, ...) -> c_int; } | |
| # fn main() { | |
| unsafe { | |
| printf(c"test\n".as_ptr()); | |
| printf(c"number = %d\n".as_ptr(), 3); | |
| printf(c"%d, %d\n".as_ptr(), 10, 5); | |
| } | |
| # } | |
| ``` |