मैं "लूप प्रारंभिक घोषणा के लिए C99 मोड के बाहर" GCC त्रुटि कैसे ठीक करूं?


116

मैं 3n + 1 समस्या को हल करने की कोशिश कर रहा हूं और मेरे पास एक forलूप है जो इस तरह दिखता है:

for(int i = low; i <= high; ++i)
        {
                res = runalg(i);
                if (res > highestres)
                {
                        highestres = res;
                }

        }

दुर्भाग्य से मुझे यह त्रुटि तब हो रही है जब मैं जीसीसी के साथ संकलन करने का प्रयास करता हूं:

3np1.c: 15: त्रुटि: 'लूप प्रारंभिक घोषणा के लिए C99 मोड के बाहर प्रयोग किया जाता है

मुझे नहीं पता कि C99 मोड क्या है। कोई विचार?

जवाबों:


148

मैं iपाश के बाहर घोषित करने की कोशिश करेंगे !

3n + 1 :-) हल करने पर शुभकामनाएँ

यहाँ एक उदाहरण है:

#include <stdio.h>

int main() {

   int i;

   /* for loop execution */
   for (i = 10; i < 20; i++) {
       printf("i: %d\n", i);
   }   

   return 0;
}

सी में छोरों के लिए और अधिक पढ़ें यहां


तो आप लूप के बजाय उपयोग क्यों नहीं करते?
एरिक डब्ल्यू

3
@ आपका प्रश्न बहुत खराब है
user25

118

एक संकलक स्विच है जो C99 मोड को सक्षम करता है , जो अन्य चीजों के बीच लूप के लिए एक चर घोषित करने की अनुमति देता है। संकलक स्विच का उपयोग करने के लिए इसे चालू करें-std=c99

या जैसा @OysterD कहता है, लूप के बाहर वैरिएबल घोषित करें।


7
वास्तव में -std = gnu99 शायद इस तरह से अधिक वांछनीय है क्योंकि आपको अभी भी gcc एक्सटेंशन मिल रहा है (gcc defaults to -std = gnu89, हालाँकि यह अगले कुछ संस्करणों में gnu99 में बदल जाएगा)
Spudd86

3
@ स्पड86: क्या आप gcc एक्सटेंशन को एनेबल करना चाहते हैं यह इस बात पर निर्भर करता है कि आप क्या कर रहे हैं। यदि आपका लक्ष्य कोड लिखना है जो कि gcc के अलावा संकलक के लिए पोर्टेबल है तो उन्हें निष्क्रिय करना मददगार है।
कीथ थॉम्पसन

21

पर जाने के लिए C99 में मोड codeblocks , अगले चरणों का पालन करें:

प्रोजेक्ट / बिल्ड विकल्पों पर क्लिक करें , फिर टैब में कंपाइलर सेटिंग्स सबटैब अन्य विकल्प चुनें , और -std=c99पाठ क्षेत्र में जगह पर क्लिक करें, और ठीक क्लिक करें ।

यह आपके कंपाइलर के लिए C99 मोड को चालू करेगा ।

मुझे उम्मीद है कि यह किसी की मदद करेगा!


यह अन्य संकलक विकल्पों के तहत कोडब्लॉक 16.1 में मदद करता है ! हालांकि मुझे -std=gnu99ऊपर दिए गए कुछ उत्तरों में दर्शाया गया है!
अंकुर शाह

लेकिन इससे अस्थायी रूप से मदद मिली! मुझे ऐसा हर बार करना होता है जब मैं कोड संकलित करता हूं! ... :(
अंकुर शाह

नहीं तुमने नहीं! यह प्रत्येक नए प्रोजेक्ट के लिए केवल एक बार किया जाना चाहिए।
akelec

14

मैंने यह त्रुटि भी पकड़ ली है।

for (int i=0;i<10;i++) { ..

C89 / C90 मानक में मान्य नहीं है। जैसा कि ओएस्टरडी कहता है, आपको करने की आवश्यकता है:

int i;
for (i=0;i<10;i++) { ..

आपका मूल कोड C99 और बाद में C भाषा के मानकों में अनुमत है।


3
Gcc के लिए, इसे "-std = c99" फेंकें। अतिरिक्त सुविधाओं के लिए, इमरान का जवाब देखें।
मैट जे

हां, यह वैध सी है; यह सिर्फ C89 / C90 के लिए मान्य नहीं है।
कीथ थॉम्पसन

@KeithThompson: स्पष्ट किया गया।
Blorgbeard

आप अभी भी कह रहे हैं कि यह मान्य सी नहीं है, केवल एक योग्यता के साथ। यह पूरी तरह से वैध सी है; 1999 के मानक को प्रतिस्थापित किया और 1990 के मानक को प्रतिस्थापित किया, और 2011 के मानक को प्रतिस्थापित किया और 1999 के मानक को प्रतिस्थापित किया (हालाँकि उत्तरार्द्ध का अस्तित्व नहीं था जब आप मूल रूप से इस उत्तर को पोस्ट करते थे)।
कीथ थॉम्पसन

@KeithThompson खैर, यह वह नहीं है जो मैंने सोचा था कि मैं कह रहा था। क्या आप विचार करेंगे "C89 / C90 मानक में मान्य नहीं है" सही है?
Blorgbeard

13

@Blorgbeard :

C99 में नई सुविधाएँ

  • इनलाइन कार्य
  • चर घोषणा अब फ़ाइल दायरे या एक यौगिक बयान की शुरुआत तक ही सीमित नहीं है
  • कई नए डेटा प्रकार, जिनमें लंबे समय तक इंट, वैकल्पिक विस्तारित पूर्णांक प्रकार, एक स्पष्ट बूलियन डेटा प्रकार, और जटिल संख्याओं का प्रतिनिधित्व करने के लिए एक जटिल प्रकार शामिल है
  • चर-लंबाई सरणियाँ
  • BCPL या C ++ में // के साथ शुरू होने वाली एक-लाइन टिप्पणियों के लिए समर्थन
  • नए पुस्तकालय कार्य, जैसे कि स्नप्रिंट
  • नई हेडर फाइलें, जैसे कि stdbool.h और inttypes.h
  • टाइप-जेनेरिक गणित कार्य (tgmath.h)
  • IEEE फ़्लोटिंग पॉइंट के लिए बेहतर समर्थन
  • नामित इनिशियलाइज़र
  • यौगिक शाब्दिक
  • वैरिएड मैक्रोज़ का समर्थन (वैरिएबल एरीस का मैक्रो)
  • अधिक आक्रामक कोड अनुकूलन की अनुमति देने के लिए योग्यता को प्रतिबंधित करें

http://en.wikipedia.org/wiki/C99

C99 का दौरा


6

यदि आप C परिवर्तन में संकलित करते हैं

for (int i=0;i<10;i++) { ..

सेवा

int i;
for (i=0;i<10;i++) { ..

आप C99 स्विच सेट के साथ भी संकलन कर सकते हैं। संकलन लाइन में पुस्ट -dd = c99:

gcc -std=c99 foo.c -o foo

REF: http://cplusplus.syntaxerrors.info/index.php?title= 'for'_loop_initial_declaration_used_outside_C99_mode


3

बाहरी स्रोत से कोड संकलित करने का प्रयास करने वाले किसी भी व्यक्ति के लिए , जैसे कि मेक जैसी एक स्वचालित बिल्ड उपयोगिता का उपयोग करता है , स्पष्ट gcc संकलन कॉल को ट्रैक करने से बचने के लिए जिसे आप पर्यावरण चर सेट कर सकते हैं। कमांड प्रॉम्प्ट पर दर्ज करें या .bashrc (या मैक पर .bash_profile) में डालें:

export CFLAGS="-std=c99"

ध्यान दें कि यदि आप C ++ संकलन के साथ समान परिदृश्य में चलते हैं तो C ++ 11 की आवश्यकता होने पर एक समान समाधान लागू होता है, आप इसका उपयोग कर सकते हैं:

export CXXFLAGS="-std=c++11"

1

मुझे भी यही समस्या थी और यह काम करता है कि आपको सिर्फ iलूप के बाहर की घोषणा करनी है :

int i;

for(i = low; i <= high; ++i)

{
        res = runalg(i);
        if (res > highestres)
        {
                highestres = res;
        }

}

1

जिहेन स्टंबौली ने ओपी प्रश्न का सबसे सीधे उत्तर दिया ... प्रश्न था; क्यों करता है

for(int i = low; i <= high; ++i)
{
    res = runalg(i);
    if (res > highestres)
    {
        highestres = res;
    }
}

त्रुटि उत्पन्न करना;

3np1.c:15: error: 'for' loop initial declaration used outside C99 mode

जिसके लिए जवाब है

for(int i = low...

होना चाहिए

int i;
for (i=low...

1

कोड में C99 मोड को सक्षम करें :: ब्लॉक 16.01

  • पर जाएं सेटिंग्स -> संकलक ...
  • में संकलक झंडे की धारा संकलक सेटिंग्स टैब का चयन करें चेकबॉक्स ' हैव 1999 आईएसओ सी भाषा मानक का पालन जीसीसी [-std = c99] '

0

Qt-creator के लिए: बस अगली पंक्तियों को * .pro फ़ाइल में जोड़ें ...

QMAKE_CFLAGS_DEBUG = \
    -std=gnu99

QMAKE_CFLAGS_RELEASE = \
    -std=gnu99
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.