2015-07-29 3 views
10

मुझे लगता है कि एक निरंतर या एक स्थिर, उदाहरण के लिए एक i32 शामिल एक जंग एपीआई है कहो। मैं इस जंग से एपी का उपयोग सी से सी से करना चाहता हूं, मैं उस स्थिरांक को सरणी आकार के रूप में उपयोग करना चाहता हूं। क्या मैं सही हूं कि ऐसा करने का कोई तरीका नहीं है? मेरी सी हेडर फाइल में लगातार कि जंग एपीआई के आराम के लिए घोषणाओं प्रदान कर रहे हैं redeclare करने के लिए सबसे अच्छा समाधान है?एक जंग लगातार/स्थिर सी से अवगत कराया जा सकता है?

अद्यतन: अधिक विशिष्ट होना करने के लिए, मैं एक संकलक जो चर लंबाई सरणियों का समर्थन नहीं करता (विजुअल C++ 2005)

उत्तर

9

आप सबसे निश्चित रूप से यह कर सकते हैं का उपयोग कर रहा, कम से कम के अंदर कार्य:

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; 
} 

संकलन:

% 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 

उच्च-स्तरीय सरणी घोषणाओं, तथापि, आकार के लिए वैश्विक चर/स्थिरांक उपयोग नहीं कर सकते, तो यह केवल अंदर कार्यों काम करेंगे।

+1

आह, यह चर-लंबाई वाले सरणी का समर्थन करने वाले कंपाइलरों के लिए ठीक काम करता है, लेकिन मेरे लिए नहीं। मैं विजुअल सी ++ 2005 कंपाइलर का उपयोग कर रहा हूं। मैं अपने प्रश्न को और अधिक विशिष्ट होने के लिए अपडेट कर दूंगा। –

+0

उस स्थिति में आप प्रीप्रोसेसर-आधारित स्थिरांक से फंस गए हैं, इसलिए आप दुर्भाग्य से जंग की तरफ परिभाषित स्थिरांक का उपयोग नहीं कर पाएंगे। –

0

अधिक विशिष्ट होना करने के लिए, मैं एक संकलक जो चर लंबाई सरणियों का समर्थन नहीं करता (विजुअल C++ 2005)

इस पर स्थिर से परिभाषित करने की (और केवल घोषित नहीं) की आवश्यकता है उपयोग कर रहा हूँ उपयोग की स्थिति। इसके अलावा, सी सी की तुलना में अधिक प्रतिबंध ++ क्या एक सरणी आयाम के रूप में एक निरंतर प्रयोग करने योग्य का गठन किया पर है: मूल रूप से पूर्णांक शाब्दिक (मैक्रो के माध्यम से प्रतिस्थापित किया जा सकता है) और प्रगणक; विपरीत सी ++ यह अभिन्न स्थिरांक (int const x) नहीं है, तो मोड (सी या सी ++) आप में संकलन के आधार पर आप सीमित हो सकती हैं।

सी फाइलों को स्वचालित रूप से उत्पन्न करने के लिए रस्टक या कार्गो में कोई सुविधा नहीं है, प्रतीकों को केवल निर्यात और लिंक-टाइम पर उपलब्ध है, संकलन समय पर नहीं।


हालांकि आप भाग्यशाली हैं, एक समाधान है, हालांकि यह थोड़ा अधिक बोझिल है।

जंग एक build.rs फ़ाइल है, जो संकलित और नियमित रूप से संकलन की प्रक्रिया के हिस्से के रूप में क्रियान्वित किया जाता है सुविधाएँ। इस फ़ाइल में आदेश शामिल कर सकते हैं अन्य फ़ाइलें उत्पन्न करने के लिए, और इसलिए यह करने के लिए पूरी तरह से संभव है:

  1. एक बार और एक .rs फ़ाइल में सभी के लिए निरंतर लिख
  2. एक सी हैडर "निर्यात" एक में इस निरंतर उत्पन्न build.rs फ़ाइल के माध्यम से सी प्रारूप।
+0

मुझे build.rs के साथ गड़बड़ करनी होगी। मैंने इसे देखा है, लेकिन कम से कम सबूत-अवधारणा के सरल होने के पक्ष में इसे पारित किया है जो मैं कर सकता था। –

संबंधित मुद्दे