我想在Rust中使用C常量。下面是C代碼的一部分:如何在Rust中訪問C常量?
#define INT_CANCEL 2
在走,我可以做這樣的事情:
return C.INT_CANCEL
我會怎麼做魯斯特類似的東西?
我已經試過類似
#[link(name = "name_of_lib")]
extern {
int INT_CANCEL
}
但是,這並不編譯。
我想在Rust中使用C常量。下面是C代碼的一部分:如何在Rust中訪問C常量?
#define INT_CANCEL 2
在走,我可以做這樣的事情:
return C.INT_CANCEL
我會怎麼做魯斯特類似的東西?
我已經試過類似
#[link(name = "name_of_lib")]
extern {
int INT_CANCEL
}
但是,這並不編譯。
我不是Gopher,但去不明白C #define
s要麼。相反,cgo does(至少some subsets of them)。
最好和最簡單的選項是將值複製到您的程序。請注意,您必須定義一個大小:
const INT_CANCEL: u8 = 2;
您還可以創建一個宏,如果你真的需要能夠等待類型在運行時決定的,但是這並不常見。
您還可以創建a build script是compiles some C code,其中包括報頭,並打印出相應的防鏽代碼:
#include <stdio.h>
#include "myheader.h"
int main(int argc, char *argv[]) {
printf("const INT_CANCEL: u8 = %d;\n", INT_CANCEL);
return 0;
}
鏽代碼可以被包含回你的項目。
你也可以嘗試修改rust-bindgen,這樣做類似的東西CGO並嘗試自動創建這些常量。
謝謝你的回答。 「最好和最簡單的選擇是將價值複製到您的程序中。」這就是我想的,我想確保我沒有失去任何東西。 –
這不是一個常量,而是一個預處理宏。 C不具有_enum-constants_以外的符號常量。 – Olaf