"C99 modu dışında kullanılan döngü ilk bildirimi" GCC hatasını nasıl düzeltirim?


116

3n + 1 problemini çözmeye çalışıyorum ve forşuna benzeyen bir döngüm var:

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

        }

Maalesef GCC ile derlemeye çalıştığımda şu hatayı alıyorum:

3np1.c: 15: hata: C99 modu dışında kullanılan 'for' döngüsü ilk bildirimi

C99 modunun ne olduğunu bilmiyorum. Herhangi bir fikir?

Yanıtlar:


148

iDöngünün dışında ilan etmeye çalışırdım!

3n + 1 :-) çözümünde bol şanslar :-)

İşte bir örnek:

#include <stdio.h>

int main() {

   int i;

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

   return 0;
}

C'deki döngüler için daha fazlasını buradan okuyun .


öyleyse neden bunun yerine while döngüsü kullanmıyorsun?
Erik W

3
@ErikW sorunuz çok kötü
user25

118

C99 modunu etkinleştiren ve diğer şeylerin yanı sıra for döngüsü içinde bir değişkenin tanımlanmasına izin veren bir derleyici anahtarı vardır . Açmak için derleyici anahtarını kullanın-std=c99

Veya @OysterD'nin dediği gibi, değişkeni döngünün dışında ilan edin.


7
aslında -std = gnu99 muhtemelen daha caziptir, çünkü bu şekilde hala gcc uzantıları elde edersiniz (gcc varsayılanı -std = gnu89, ancak bu sonraki birkaç sürümde bir noktada gnu99 olarak değişecektir)
Spudd86

3
@ Spudd86: gcc uzantılarını etkinleştirmek isteyip istemediğiniz , ne yaptığınıza bağlıdır. Bunları devre dışı bırakmak, amacınız gcc dışındaki derleyiciler için taşınabilir kod yazmaksa yararlıdır.
Keith Thompson

21

CodeBlocks'ta C99 moduna geçmek için aşağıdaki adımları izleyin:

Click Projesi / Yapı seçenekleri daha sonra sekmede, Derleyici Ayarları alt sekmesi seçmek Diğer seçenekler ve yer -std=c99metin alanında ve tıklayın Ok .

Bu, Derleyiciniz için C99 modunu açacaktır .

Umarım bu birine yardımcı olur!


Bu, Diğer Derleyici seçenekleri altındaki 16.1 kod bloklarına yardımcı oldu ! Kullanmış rağmen -std=gnu99yukarıda bazı cevaplar gösterildiği gibi!
Ankur Shah

Ancak bu geçici olarak yardımcı oldu! Kodu her derlediğimde bunu yapmam gerekiyor! ... :(
Ankur Shah

Hayır senin yok! Bu, her yeni proje için yalnızca bir kez yapılmalıdır.
akelec

14

Ben de bu hatayı aldım.

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

C89 / C90 standardında geçerli değildir. OysterD'nin dediği gibi yapmanız gerekenler:

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

Orijinal kodunuza C99'da ve daha sonraki C dili standartlarında izin verilir.


3
Gcc için bir "-std = c99" değeri verin. Ek özellikler için Imran'ın cevabına bakınız.
Matt J

Evet, C geçerlidir; sadece geçerli C89 / C90 değil.
Keith Thompson

@KeithThompson: açıklığa kavuşturuldu.
Blorgbeard

Hala bunun geçerli C olmadığını söylüyorsunuz, sadece bir nitelikle. Öyle mükemmel geçerli bir C; 1999 standardı 1990 standardının yerini aldı ve 2011 standardı 1999 standardının yerini aldı ve onun yerini aldı (ancak ikincisi, bu cevabı ilk gönderdiğinizde mevcut değildi).
Keith Thompson

@KeithThompson Evet, söylediğimi düşündüğüm bu değildi. "C89 / C90 standardında geçerli değildir" doğru mu?
Blorgbeard

13

@Blorgbeard :

C99'daki Yeni Özellikler

  • satır içi işlevler
  • değişken bildirimi artık dosya kapsamı veya bir bileşik ifadenin başlangıcı ile sınırlı değil
  • long long int, isteğe bağlı genişletilmiş tam sayı türleri, açık bir boolean veri türü ve karmaşık sayıları temsil eden karmaşık bir tür dahil olmak üzere birkaç yeni veri türü
  • değişken uzunluklu diziler
  • BCPL veya C ++ 'da olduğu gibi // ile başlayan tek satırlık yorumlar için destek
  • snprintf gibi yeni kütüphane işlevleri
  • stdbool.h ve inttypes.h gibi yeni başlık dosyaları
  • tür genel matematik işlevleri (tgmath.h)
  • IEEE kayan nokta için geliştirilmiş destek
  • belirlenmiş başlatıcılar
  • bileşik değişmez değerler
  • değişken makrolar için destek (değişken aritenin makroları)
  • daha agresif kod optimizasyonuna izin vermek için yeterliliği kısıtlayın

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

C99 Turu



3

Make gibi otomatik bir derleme yardımcı programı kullanan harici bir kaynaktan kod derlemeye çalışan herkes için, açık gcc derleme çağrılarını izlemek zorunda kalmamak için bir ortam değişkeni ayarlayabilirsiniz. Komut istemine girin veya .bashrc (veya Mac'te .bash_profile) koyun:

export CFLAGS="-std=c99"

Benzer bir çözümün, C ++ 11 gerektiren C ++ derlemesiyle benzer bir senaryoyla karşılaşırsanız, şunu kullanabileceğinizi unutmayın:

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

1

Ben de aynı sorunu yaşadım ve işe yarıyor, sadece idöngünün dışını bildirmeniz gerekiyor :

int i;

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

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

}

1

Jihene Stambouli OP sorusunu en doğrudan cevapladı ... Soru şuydu; neden yapar

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

hatayı üretmek;

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

bunun için cevap

for(int i = low...

olmalı

int i;
for (i=low...

1

Code :: Blocks 16.01'de C99 modunu etkinleştirin

  • Gidin Ayarlar -> Derleyici ...
  • In Derleyici Bayraklar bölümünde Derleyici ayarları sekmesinde, onay kutusu ' Var 1999 ISO C dili standart takip GCC [-std = c99] '

0

Qt-creator için: sadece sonraki satırları * .pro dosyasına ekleyin ...

QMAKE_CFLAGS_DEBUG = \
    -std=gnu99

QMAKE_CFLAGS_RELEASE = \
    -std=gnu99
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.