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:
#![allow(unused)]
fn main () {
use std::os::raw::{c_char, c_int};
extern "C" {
fn printf (_: *const c_char, ...) -> c_int;
}
unsafe { printf(); }
}
ⓘ
Using this declaration, it must be called with at least one argument, so
simply calling printf()
is invalid. But the following uses are allowed:
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 {
use std::ffi::CString;
let fmt = CString::new("test\n" ).unwrap();
printf(fmt.as_ptr());
let fmt = CString::new("number = %d\n" ).unwrap();
printf(fmt.as_ptr(), 3 );
let fmt = CString::new("%d, %d\n" ).unwrap();
printf(fmt.as_ptr(), 10 , 5 );
}
}