C++

2016-01-11 11 views
10

से C99-style array फ़ंक्शन हस्ताक्षर के साथ सबसे अच्छा कॉल कैसे करें I C++ में कुछ कोड लिख रहा हूं जिसे C99 में लिखी गई लाइब्रेरी को कॉल करने की आवश्यकता है। यह लाइब्रेरी अपने फ़ंक्शन पैरामीटर में static कीवर्ड के साथ C99-style सरणी घोषणाओं का उपयोग करती है। यानी, जैसे:C++

void my_func(int n, int my_ints[static n]); 

लेकिन, मेरा सी में इस पुस्तकालय के शीर्ष लेख ++ परियोजना, संकलक (बजना) सहित जब एक चेतावनी फेंकता है जब -pedantic ध्वज का उपयोग:

> g++ -pedantic -c my_code.cpp 
In file included from my_code.cpp: 
./my_c_lib.h: warning: variable length arrays are a C99 feature [-Wvla-extension] 
void my_func(int n, int my_ints[static n]); 

क्या है इस मामले में सी पुस्तकालय को कॉल करने का सही/सर्वोत्तम तरीका? vla-extension चेतावनी को बंद करने के अलावा, क्या इसके आसपास कुछ रास्ता है जिसमें पुस्तकालय के शीर्षलेखों को फिर से लिखना या इंटरमीडिएट सी रैपर लिखना शामिल नहीं है?

मिनिमल काम कर रहे उदाहरण:

extern "C" { 
    void my_func(int n, int my_ints[static n]); 
} 

int main() 
{ 
    int* some_ints = new int[10]; 
    my_func(10, some_ints); 
    delete[] some_ints; 
    return 0; 
} 
+0

क्या आपको '-pedantic' ध्वज का उपयोग करके संकलित करने की आवश्यकता है? यह ध्वज राज्यों की तरह है, यह आपको पैडेंटिक एएनएसआई मानकों का पालन करने के लिए मजबूर करने के लिए डिज़ाइन किया गया है, जो कि अधिक सख्त है, फिर केवल '-एएनएसआई' ध्वज, जो पहले से ही काफी सख्त है। एक सी 99 सुविधा का उपयोग करके आप पैडेंटिक मानकों को कोडिंग नहीं कर रहे हैं। –

+0

@ जोइटमैन मैं पोर्टेबिलिटी ध्वज का उपयोग पोर्टेबिलिटी सुनिश्चित करने के लिए कर रहा हूं, लेकिन यह शीर्ष पर हो सकता है। वीएलए स्पष्ट रूप से एक सी 99 सुविधा है, और 'जी ++' सही तरीके से इसके लिए चेतावनी देता है - इसलिए मेरा प्रश्न। लाइब्रेरी को 'gcc -c -std = c99 -pedantic' का उपयोग करके संकलित किया गया है, जिस स्थिति में वीएलए ठीक होना चाहिए, है ना? –

+0

आपको यह पता होना चाहिए कि आप वास्तव में किस प्लेटफॉर्म के लिए प्रोग्रामिंग कर रहे हैं) एक मानक के साथ ठीक रहें जो पिछले महीने 16 हो गया था और चार साल पहले बदल दिया गया था। यदि आप उस चरम पर पोर्टेबिलिटी के बारे में वास्तव में चिंतित हैं तो आपको मानक सी के साथ अपने सी 99 वीएलए को बदलना होगा। –

उत्तर

4

सच्चाई यह है कि सी ++ बस Vlas कि C99 लोगों के रूप में लगभग के रूप में शक्तिशाली हैं, और यह नहीं है शायद कभी नहीं करेंगे; भाषा में वीएलए को शामिल करने के लिए किए जा रहे अग्रिम इतने भारी प्रतिबंधित हैं कि वे काफी बेकार हैं।

कहा यही कारण है, अपने सबसे अच्छे शर्त है कि आप वास्तव में उपयोग पुस्तकालय कार्यों, जो शैली

void my_func_wrap(int n, int* my_ints); 

ये तो जैसे एक C99 फाइल में लागू किया जाएगा के इंटरफेस का पर्दाफाश करने के लिए कुछ रैपर लिखने के लिए की संभावना है:

void my_func_wrap(int n, int* my_ints) { 
    my_func(n, my_ints); 
} 

दोनों सी हेडर और कार्यान्वयन के साथ फ़ाइल दोनों को आपके लाइब्रेरी हेडर से स्वतः उत्पन्न किया जा सकता है क्योंकि परिवर्तन तुच्छ के बगल में है। अब आप किसी भी प्रकार के संघर्ष के बिना अपने सी ++ कोड से रैपर को कॉल कर सकते हैं।


एक दूसरा संभव दृष्टिकोण स्क्रिप्ट पुस्तकालय हेडर से सभी [] कोष्ठक की सामग्री स्ट्रिप्स लिखते हैं, और इसके बजाय उसका उपयोग करने के लिए किया जाएगा। यह पूरी तरह से,

void my_func_wrap(int n, int* my_ints); 

में घोषणा

void my_func_wrap(int n, int my_ints[static n]); 

decays काम करेगा क्योंकि C99 में भी यही वजह है कि मैं ऊपर आवरण समारोह में किसी भी डाली जरूरत नहीं थी (मैं इस पागल लगता है , लेकिन यह सच है)। यह सिर्फ आपका सी ++ कंपाइलर है जो पहले वाक्यविन्यास संस्करण को पसंद नहीं करता है।

+0

बिल्कुल, यह वास्तव में केवल वाक्यविन्यास अंतर है। अर्थात् वे वही हैं। यहां तक ​​कि यदि सी ++ में वीएलए नहीं होता है, तो यह संकेतक के लिए फ़ंक्शन हस्ताक्षर में वीएलए घोषणाओं को क्षीण करने के लिए असंभव प्रतीत होता है क्योंकि यह सी –

+1

में किया गया है _ "सी ++ में वीएलए नहीं हैं जो सी 99 के रूप में लगभग शक्तिशाली हैं" _ या, वास्तव में , बिलकुल। –

+0

@ लाइटनेसरेसेसिन ऑर्बिट अफैइक सी ++ * * सीएलए + में वीएलए की कुछ धारणा होगी, हालांकि बहुत ही सीमित अर्थ में। यही कारण है कि मैंने अपना शब्द थोड़ा सा खुला छोड़ दिया, भले ही मैं वास्तव में सी ++ 11 के लिए मजबूत शब्दों का उपयोग कर सकता था। मुद्दा यह है कि सी ++ अगले बीस वर्षों में किसी भी उपयोगी वीएलए कार्यान्वयन को अपनाने की प्रतीत नहीं होता है। – cmaster

0

वहाँ इसके चारों ओर कोई रास्ता है कि पुस्तकालय के हेडर को फिर से लिखने या एक मध्यवर्ती सी आवरण लेखन को शामिल नहीं करता है?

ज़रूर, तुम सिर्फ extern बयान के भीतर पूरे ग हैडर संलग्न कर सकते हैं:

extern "C" { 
    #include "my_c_lib.h" 
} 
+0

धन्यवाद। हालांकि, मुझे लगता है कि आपने मुझे गलत समझा होगा। यदि आप न्यूनतम उदाहरण देखते हैं, तो फ़ंक्शन हस्ताक्षर को एक अलग शीर्षलेख पर ले जाना और इसमें शामिल है (जो, मुझे लगता है, आपके सुझाव के अनुरूप होगा) चेतावनी को नहीं हटाता है। –

+0

@FredrikSavje हम्म, मैंने इसे अनदेखा कर दिया है। मुझे यकीन नहीं है कि क्या जीसीसी एक ही समय में सी और सी ++ के लिए दो '-std =' विकल्पों के साथ हो जाता है। वीएलए जीसीसी (साथ ही सी ++ के लिए) का एक समर्थित विस्तार है, इसलिए यदि आप सुनिश्चित हैं कि आप जो कर रहे हैं वह सही तरीके से काम करता है तो चेतावनी को अनदेखा करें। –

+0

यह जादुई रूप से सी भाषा में स्विच नहीं करता है, और यह निश्चित रूप से जादूगर रूप से वीएलए चालू नहीं करता है !! –