2014-09-19 9 views
7

मैं सिर्फ सी में कूद कर रहा हूँ ++, Cसी ++ सरणी आकार घोषणा और स्थिरांक

से सी में (89/90) आ रहा है, एक const वास्तव में नहीं है एक निरंतर (के रूप में एक #define करने का विरोध 'd, enum, या शाब्दिक), बल्कि एक बार सेट केवल पढ़ने के लिए। यानी, मैं कर सकते हैं:

const int x = rand(); 

और यह ठीक है - बिंदु जा रहा है x क्रम तक ज्ञात नहीं है। इसलिए, मैं

int arr[x]; // error - x is not a compile-time constant 

फिर, सी मानकों में से एक (99?) आगे बढ़ गया और परिवर्तनीय-लंबाई सरणी के लिए अनुमति दी गई। हालांकि मैं आमतौर पर सी में एएनएसआई मानक के खिलाफ कोड करता हूं, लेकिन वास्तव में इसका असर पड़ा है कि मैं सी ++ 11 लेने की कोशिश कर रहा हूं।

जहां तक ​​मुझे पता है, सी ++ परिवर्तनीय-लंबाई सरणी के लिए अनुमति नहीं देता है। हालांकि, कई कंपाइलर्स इसे एक एक्सटेंशन (जीसीसी?) के रूप में अनुमति देते हैं। समस्या यह है कि अब मैं सी ++ 11 सीखने की कोशिश कर रहा हूं, मैं यह नहीं बता सकता कि क्या मैं कोडिंग कर रहा हूं वैध सी ++ है, या सी ++ सी 99-संगतता के साथ विस्तारित है। पूर्व:

std::default_random_engine e{}; 
std::uniform_int_distribution<int> d{}; 
const int x{d(e)}; 
int arr[x]; // compiles 

मैं यह नहीं बता सकता कि यह वैध सी ++ है या नहीं। जाहिर है, x का मान रनटाइम तक ज्ञात नहीं है। मुझे लगता है कि मैं सी और सी ++ const के बीच अंतर को समझ नहीं सकता?

+0

मान्य नहीं है। झंडे का प्रयोग करें '-std = ...' जहां '...' मानक है, उदा। 'सी ++ 11' या 'सी ++ 98'। – juanchopanza

+2

आप '-pedantic' – Jarod42

+0

@juanchopanza का भी उपयोग कर सकते हैं मैंने वास्तव में' -std = C++ 11' का उपयोग करके संकलित किया था और क्लैंग ने कोई चेतावनी नहीं दी थी। शाफिक ने सुझाव दिया कि चेतावनी पॉप अप करने के सुझाव के रूप में '-pedantic' ध्वज का उपयोग करना! – zac

उत्तर

9

आप सही VLAs are a C99 feature (C11 में वैकल्पिक) और सी ++ मानक इस सुविधा हालांकि gcc और clang दोनों एक विस्तार के रूप C++ में उन्हें अनुमति शामिल नहीं है कर रहे हैं। -pedantic ध्वज का उपयोग कर जब आप एक एक्सटेंशन का उपयोग कर रहे हैं चेतावनी देगा

D1 [ constant-expressionopt] attribute-specifier-seqopt 
    ^^^^^^^^^^^^^^^^^^^^^^ 

gcc और clang दोनों के लिए: हम देख सकते हैं कि वे draft C++11 standard अनुभाग 8.3.4सरणी जो कहते हैं पर जाकर अनुमति नहीं है। यदि आप सी ++ 11 को लक्षित कर रहे हैं तो आपको यह भी निर्दिष्ट करना चाहिए कि -std=c++11 का उपयोग करना। चेतावनी को त्रुटियों में बदलने के लिए आप -pedantic-errors का उपयोग कर सकते हैं।

warning: ISO C++ forbids variable length array 'arr' [-Wvla] 
int arr[x]; // compiles 
     ^

gcc विभिन्न मानकों, चूक और झंडे उनके Language Standards Supported by GCC पृष्ठ पर मानक लागू करने के लिए के लिए उनके समर्थन के दस्तावेजों और यह कहते हैं:: आप -pedantic का उपयोग कर अपने कोड संकलन यदि आप निम्न चेतावनी देखना चाहिए

मानक द्वारा आवश्यक सभी डायग्नोस्टिक्स प्राप्त करने के लिए, आपको भी निर्दिष्ट-निर्दिष्ट (या -पैंटिक-त्रुटियों को निर्दिष्ट करना चाहिए यदि आप उन्हें चेतावनियों के बजाए त्रुटियां) चाहते हैं।

सामान्य clang में समर्थन करता है, क्या gcc करता है, लेकिन आप उनके Language Compatibility पृष्ठ पर और अधिक जानकारी प्राप्त कर सकते हैं।

जैसा कि जिंजरप्लसप्लस std:vector द्वारा उल्लिखित नोट सी ++ में वीएलए के लिए विकल्प माना जाता है।

+0

आश्चर्यजनक नहीं पता था !! तो ऐसा लगता है कि यह * है * सी 99 एक्सटेंशन – zac

+0

का उपयोग करके (बहुत तेज) प्रतिक्रिया के लिए धन्यवाद! – zac

+0

संपादन के लिए भी धन्यवाद .. इससे अब यह बहुत स्पष्ट हो जाता है – zac

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