2015-07-29 23 views
10

Ben mesela bir I32, sabit veya statik içeren bir Pas API olduğunu varsayalım. Bu Rust API'sini C'den kullanmak istiyorum. C kısmından, bu sabiti bir dizi boyutu olarak kullanmak istiyorum. Bunu yapmanın bir yolu olmadığını düzelttim mi? Rust API'sinin geri kalanı için bildirimleri sağlayan C başlık dosyamdaki sabiti tekrar bulmak için en iyi çözüm mü?Pas sabit/statik C'ye maruz kalabilir mi?

Güncelleme: Ben, en azından iç fonksiyonları Sen kesinlikle bunu yapabilir

cevap

9

değişken uzunlukta diziler desteklemeyen bir derleyici (Visual C++ 2005) kullanıyorum, daha spesifik olmak gerekirse:

cnst.rs:

#[no_mangle] 
pub static X: i32 = 42; 

cnstuse.c:

#include <stdint.h> 
#include <stdio.h> 

extern const int32_t X; 

int main() { 
    char data[X]; 
    printf("%lu\n", sizeof(data)); 
    return 0; 
} 

Derleme:

% rustc --crate-type=staticlib cnst.rs 
note: link against the following native artifacts when linking against this static library 
note: the order and any duplication can be significant on some platforms, and so may need to be preserved 
note: library: System 
note: library: pthread 
note: library: c 
note: library: m 
% gcc -o cnstuse cnstuse.c libcnst.a 
% ./cnstuse 
42 

Üst düzey dizisi bildirimleri ise beden için küresel değişkenler/sabitleri kullanamazsınız, bu nedenle bu sadece iç fonksiyonları çalışacaktır.

+1

Ah. Visual C++ 2005 derleyicisini kullanıyorum. Daha spesifik olmak için sorumu güncelleyeceğim. –

+0

Bu durumda, önişlemci tabanlı sabitler ile sıkışmış, bu yüzden ne yazık ki, Pas tarafında tanımlanan sabitleri kullanamazsınız. –

0

daha spesifik olmak gerekirse, ben değişken uzunlukta diziler desteklemeyen bir derleyici (Visual C++ 2005)

Bu, en tanımlanacak sabit (ve sadece beyan değil) gerektirir kullanıyorum Kullanım noktası. Dahası, C, bir dizi boyutu olarak kullanılabilir olan bir sabitin ne olduğu konusunda C++ 'dan çok daha fazla kısıtlamaya sahiptir: temel olarak tamsayı editörleri (makrolar ile ikame edilebilir) ve sayımcılar; C++ 'dan farklı olarak, integral sabitleri yoktur (int const x), bu nedenle derlemiş olduğunuz moda (C veya C++) bağlı olarak kısıtlanmış olabilirsiniz. otomatik C dosyaları oluşturmak için rustc veya Kargo hiçbir tesis yoktur

, semboller sadece derleme sırasında, bağlantı sırasında ihraç ve kullanılabilir edilmektedir.


Ancak, biraz daha hantal olsa da bir çözüm var, şanslısınız.

Pas derlenmiş ve düzenli derleme sürecinin bir parçası olarak yürütülen bir build.rs dosyayı sahiptir.

  • bir de bu sabit "ihraç" C başlığını oluşturun ve son kez bir .rs dosyada sabit bir yere yazın

    1. : Bu dosya diğer dosyaları oluşturmak için komut içerebilir ve bu da pekala mümkündür nedenle C formatı build.rs dosyasından. Değişken uzunlukta diziler destekleyen derleyiciler için ince ama benimki için çalışır
  • +0

    Build.rs ile uğraşmak zorunda kalacağım. Gördüm, ama olabildiğince az bir kavram kanıtı almanın lehine geçtim. –

    İlgili konular