在build.rs
時間,我生成鏽代碼,隨着參數個數可變調用C函數:如何確定目標平臺不是主機平臺的build_rs時間的c_uint大小?
//build.rs
fn generate_code(param_name: &str, param_type: &str);
這產生:
c_func(x, {param_name});
其中param_type
是任意整數類型。
問題在於「整數促銷」。例如,下面的代碼給出了一個編譯時錯誤,因爲p
應該由C調用約定variadics被提升到c_uint
和鏽沒有做它含蓄:
use std::os::raw::c_uint;
extern "C" {
fn c_func(x: c_uint, ...);
}
fn main() {
let x: c_uint = 1;
let p: u8 = 2;
c_func(x, p);
}
促進整數,我需要知道的c_uint
在目標平臺上大小整數類型與尺寸< = c_uint
轉換爲c_uint
(並簽署類型c_int
),
也許有某種把戲我可以生成代碼的幫助下做( 像c_func(x, p.promote());
),其中promote
功能是一些神奇的trait
的一部分,促進適當的類型?
爲什麼不只是'c_func(x,p as c_uint)'? – Shepmaster
@Shepmaster因爲p的大小可能會更大,在這種情況下'c_uint'我不需要這個對話,實際上這個對話在這種情況下會產生錯誤。 – user1244932