]> git.lizzy.rs Git - rust.git/blob - compiler/rustc_error_codes/src/error_codes/E0060.md
Rollup merge of #92310 - ehuss:rustdoc-ice, r=estebank
[rust.git] / compiler / rustc_error_codes / src / error_codes / E0060.md
1 External C functions are allowed to be variadic. However, a variadic function
2 takes a minimum number of arguments. For example, consider C's variadic `printf`
3 function:
4
5 ```compile_fail,E0060
6 use std::os::raw::{c_char, c_int};
7
8 extern "C" {
9     fn printf(_: *const c_char, ...) -> c_int;
10 }
11
12 unsafe { printf(); } // error!
13 ```
14
15 Using this declaration, it must be called with at least one argument, so
16 simply calling `printf()` is invalid. But the following uses are allowed:
17
18 ```
19 # #![feature(static_nobundle)]
20 # use std::os::raw::{c_char, c_int};
21 # #[cfg_attr(all(windows, target_env = "msvc"),
22 #            link(name = "legacy_stdio_definitions", kind = "static-nobundle"))]
23 # extern "C" { fn printf(_: *const c_char, ...) -> c_int; }
24 # fn main() {
25 unsafe {
26     use std::ffi::CString;
27
28     let fmt = CString::new("test\n").unwrap();
29     printf(fmt.as_ptr());
30
31     let fmt = CString::new("number = %d\n").unwrap();
32     printf(fmt.as_ptr(), 3);
33
34     let fmt = CString::new("%d, %d\n").unwrap();
35     printf(fmt.as_ptr(), 10, 5);
36 }
37 # }
38 ```