2010-11-11 13 views
9

मैं पढ़ा है कि C89 चर लंबाई सरणियों का समर्थन नहीं करता है, लेकिन निम्न प्रयोग है कि खंडन लगता है:सी 8 9 में परिवर्तनीय-लंबाई सरणी?

#include <stdio.h> 

int main() 
{ 
    int x; 
    printf("Enter a number: "); 
    scanf("%d", &x); 
    int a[x]; 
    a[0] = 1; 
    // ... 
    return 0; 
} 

मैं इस तरह के रूप संकलन जब (यह मानते हुए फ़ाइल नाम va_test.c है):

gcc va_test.c -std=c89 -o va_test 

यह काम करता है ...

मुझे क्या याद आ रही है? :-)

+0

मैं तुम्हें विश्वास नहीं है। '-std = c89' वैरिएबल घोषणाओं से पहले बयान को भी अस्वीकार करता है, जो आपके कोड में है, ताकि यदि आप वास्तव में' -std = c89' के साथ संकलित हो तो एक कंपाइलर त्रुटि उत्पन्न होती। डिफ़ॉल्ट '-std = gnu90' है जो vlas और C89/C90 भाषा में कई अन्य एक्सटेंशन का समर्थन करता है। –

+0

@ आर। जीसीसी 4.3.4 (जो मेरे पास है) वेरिएबल्स से खुश हैं, लेकिन उन्हें '//' टिप्पणियां पसंद नहीं हैं। यह मेरे लिए पूरी तरह से स्पष्ट नहीं है कि क्या '// ...' प्रश्नकर्ता के असली कोड से शब्दशः है, या एक elision के रूप में इरादा है। मैंने बाद वाले को सोचा होगा। –

+0

विषम। मुझे लगता है कि यह जीसीसी संस्करणों के बीच बदलता है और मैंने थोड़ी देर के लिए कोशिश नहीं की है। –

उत्तर

10

जीसीसी हमेशा परिवर्तनीय लंबाई सरणी AFAIK का समर्थन करता है। C89 के लिए -std स्थापना जीसीसी एक्सटेंशन बंद नहीं करता ...

संपादित करें: वास्तव में तुम यहाँ की जाँच करता है, तो:

:

http://gcc.gnu.org/onlinedocs/gcc/C-Dialect-Options.html#C-Dialect-Options

तहत -std = आप निम्नलिखित मिलेगा

आईएसओ सी 9 0 प्रोग्राम (कुछ जीएनयू एक्सटेंशन जो आईएसओ सीके साथ संघर्ष अक्षम हैं)। सी कोड के लिए -ansi के समान।

"निश्चित" शब्द पर ध्यान दें।

+3

इस पृष्ठ में व्याख्या करने के लिए यह सटीक उदाहरण है: http://www.network-theory.co.uk/docs/gccintro/gccintro_28.html – caveman

+0

@caveman: अच्छा लिंक :) – Goz

2

आप -pedantic के बिना अनुपलब्ध हैं, जीसीसी एक मानक-अनुरूप सी संकलक नहीं है (और होने का दावा नहीं करता है)। इसके बजाए, यह सी की जीएनयू बोली को संकलित करता है, जिसमें विभिन्न एक्सटेंशन शामिल हैं।

+0

आप '-pedantic-error' का भी उपयोग कर सकते हैं चेतावनियों के बजाए त्रुटियों को मजबूर करने के लिए। –

+3

@ मैथ्यू: हाँ, यदि आप '-Werror' के लिए पर्याप्त कठिन नहीं हैं ;-) –

+0

मैं निश्चित रूप से एक विंप – pmg

7

C89 // टिप्पणियां नहीं पहचानता है।

सी 8 9 कोड के साथ अंतःस्थापित परिभाषाओं की अनुमति नहीं देता है।

आप fflush(stdout)printf के बाद की जरूरत है scanf से पहले शीघ्र seing के बारे में सुनिश्चित किया जाना है।

main "बेहतर लग रहा है" के रूप में int main(void)

gcc -std=c89 -pedantic ... प्रयास करें बजाय

+1

:) ... मुझे मेरे इंजीनियरिंग स्कूल के पहले कुछ महीनों की याद दिलाता है। उसके बाद, हमें c89 मानक अनुपालन कोड कोड करना था। '-ansi - pedantic' के साथ 1 चेतावनी और आपको 0 ... अच्छे पुराने दिन मिल गए हैं ... – log0

+0

एकमात्र चीज जो मैं वास्तव में चाहता हूं कि सी 8 9 में लूप नियंत्रण खंड में 'int ...' परिवर्तनीय घोषणा है - - ओह, और सटीक-चौड़ाई पूर्णांक प्रकार – pmg

+0

मुझे वैरैडिक मैक्रोज़ भी पसंद हैं, हालांकि मैं अपने सभी कोड में टर्न-ऑफ-एंड-ऑनबल लॉगिंग स्कैटरिंग के बारे में कम जुनूनी हूं। –