| 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); |
| } |
| # } |
| ``` |