2011-03-09 23 views
16

मैं एमएस विजुअल सी ++ में सी 99 में परिभाषित वीएलए, वैरिएबल लम्बाई सरणी के उपयोग को कैसे सक्षम कर सकता हूं या यह संभव नहीं है?एमएस विजुअल सी ++ में वीएलए (परिवर्तनीय लंबाई सरणी) को सक्षम करना?

हाँ मुझे पता है कि सी ++ मानक सी 8 9 पर आधारित है और वीएलए सी 8 9 मानक में उपलब्ध नहीं हैं और इस प्रकार सी ++ में उपलब्ध नहीं हैं, लेकिन एमएसवीसी ++ को सी कंपाइलर भी माना जाता है, एक ऐसा व्यवहार जो हो सकता है/टीसी कंपाइलर पैरामीटर (Compile as C Code (/TC)) का उपयोग करने पर स्विच किया गया। लेकिन ऐसा करने से VLAs को सक्षम नहीं लगता है और संकलन प्रक्रिया C++ (Compile as C++ Code (/TP)) के निर्माण के दौरान समान त्रुटियों के साथ विफल हो जाती है। हो सकता है कि एमएसवीसी ++ सी कंपाइलर केवल सी 8 9 अनुरूप है या मुझे कुछ याद आ रहा है (कुछ विशेष निर्माण या प्रगति/परिभाषित)?

कोड का नमूना:

#include <stdlib.h> 

int main(int argc, char **argv) 
{ 
    char pc[argc+5]; 

    /* do something useful with pc */ 

    return EXIT_SUCCESS; 
} 

संकलित त्रुटियों:

त्रुटि C2057: उम्मीद निरंतर अभिव्यक्ति

त्रुटि C2466: लगातार आकार की एक सरणी आवंटित नहीं कर सकता 0

त्रुटि C2133 : 'पीसी': अज्ञात आकार

उत्तर

16

एमएसवीसी एक सी 99 संकलक नहीं है, और चर लंबाई लंबाई सरणी का समर्थन नहीं करता है।

https://docs.microsoft.com/en-us/cpp/c-language/ansi-conformance पर एमएसवीसी को सी 0 9 के अनुरूप माना जाता है।

+2

इतना ही नहीं, शायद यह कभी नहीं होगा: http://connect.microsoft.com/VisualStudio/feedback/details/333273/request-for-c99-vla-in-visual-studio बहुत खराब। –

+0

तब विवाद सुलझता है। :-) क्या ऐसी भाषा में माइक्रोसॉफ्ट एक्सटेंशन है जो वीएलए को सक्षम बनाता है? जीसीसी में एक है, इस प्रकार सी 99 अनुपालन के अलावा उन्हें सी 9 0 और सी ++ के लिए सक्षम बनाता है। http://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html – Shinnok

+0

मुझे लगता है कि जॉन प्रदान किया गया लिंक इंगित करता है कि ऐसा नहीं है, और जल्द ही कोई समय नहीं होगा। –

4

वीएलए लिखने के लिए बहुत साफ हैं लेकिन alloca() का उपयोग करके आप समान व्यवहार प्राप्त कर सकते हैं जब std::vector की गतिशील स्मृति आवंटन निषिद्ध है।

http://msdn.microsoft.com/en-us/library/x9sx5da1.aspx

का उपयोग alloca() अपने उदाहरण में देना होगा:

#include <stdlib.h> 
#include <alloca.h> 

int main(int argc, char **argv) 
{ 
    char* pc = (char*) alloca(sizeof(char) * (argc+5)); 

    /* do something useful with pc */ 

    return EXIT_SUCCESS; 
} 
+1

एमएसवीसी के नए संस्करणों में '_malloca' के पक्ष में 'alloca' और उसके दोस्त' _alloca' को बहिष्कृत किया गया है। और यह फ़ंक्शन उपयोग करने के लिए इतना परेशान है कि केवल स्थिर लंबाई की सरणी घोषित करना और इसका उपयोग करना बेहतर है। –

1

मैं एक ही समस्या से मुलाकात की, इस एमएस विजुअल C++ 2015 में संभव नहीं है, बजाय आप लगभग ऐसा ही करने के वेक्टर उपयोग कर सकते हैं, केवल अंतर हेप संसाधन प्रबंधन के उपेक्षित ओवरहेड नियमित (नए/हटाएं) का प्रबंधन करता है।

हालांकि वीएलए सुविधाजनक है, लेकिन स्टैक ओवरफ्लो के जोखिम पर स्टैक से गैर-निर्धारिती मात्रा की स्मृति आवंटित करने के लिए आम तौर पर एक अच्छा विचार नहीं है।

+0

यह प्रश्न का उत्तर नहीं प्रदान करता है। एक बार आपके पास पर्याप्त [प्रतिष्ठा] (https://stackoverflow.com/help/whats-reputation) हो जाने पर आप [किसी भी पोस्ट पर टिप्पणी कर सकेंगे] (https://stackoverflow.com/help/privileges/comment); इसके बजाय, [उन उत्तरों को प्रदान करें जिन्हें पूछताछ से स्पष्टीकरण की आवश्यकता नहीं है] (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can- i-कर-बजाय)। - [समीक्षा से] (/ समीक्षा/कम गुणवत्ता वाली पोस्ट/18967986) – Agush

+0

क्षमा करें, मैंने जो लिंक आपको दिया है, उससे मैंने सीखा है, थक्स आउट करने के लिए! –

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

  • कोई संबंधित समस्या नहीं^_^