2016-11-23 43 views
-1

我想在Rust中使用C常量。下面是C代碼的一部分:如何在Rust中訪問C常量?

#define INT_CANCEL 2 

在走,我可以做這樣的事情:

return C.INT_CANCEL 

我會怎麼做魯斯特類似的東西?

我已經試過類似

#[link(name = "name_of_lib")] 
extern { 
    int INT_CANCEL 
} 

但是,這並不編譯。

+7

這不是一個常量,而是一個預處理宏。 C不具有_enum-constants_以外的符號常量。 – Olaf

回答

4

我不是Gopher,但不明白C #define s要麼。相反,cgo does(至少some subsets of them)。

最好和最簡單的選項是將值複製到您的程序。請注意,您必須定義一個大小

const INT_CANCEL: u8 = 2; 

您還可以創建一個宏,如果你真的需要能夠等待類型在運行時決定的,但是這並不常見。

您還可以創建a build scriptcompiles 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並嘗試自動創建這些常量。

+0

謝謝你的回答。 「最好和最簡單的選擇是將價值複製到您的程序中。」這就是我想的,我想確保我沒有失去任何東西。 –