Jak naprawić błąd GCC „dla deklaracji początkowej pętli używanej poza trybem C99”?


116

Próbuję rozwiązać problem 3n + 1 i mam forpętlę, która wygląda tak:

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

        }

Niestety pojawia się ten błąd, kiedy próbuję kompilować z GCC:

3np1.c: 15: błąd: początkowa deklaracja pętli „for” używana poza trybem C99

Nie wiem, co to jest tryb C99. Jakieś pomysły?

Odpowiedzi:


148

Spróbowałbym zadeklarować ipoza pętlą!

Powodzenia w rozwiązywaniu 3n + 1 :-)

Oto przykład:

#include <stdio.h>

int main() {

   int i;

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

   return 0;
}

Przeczytaj więcej na temat pętli w C. tutaj .


to dlaczego nie użyjesz zamiast tego pętli while?
Erik W

3
@ErikW Twoje pytanie jest bardzo złe
user25

118

Istnieje przełącznik kompilatora, który włącza tryb C99 , który między innymi umożliwia deklarację zmiennej wewnątrz pętli for. Aby go włączyć, użyj przełącznika kompilatora-std=c99

Lub, jak mówi @OysterD, zadeklaruj zmienną poza pętlą.


7
faktycznie -std = gnu99 jest prawdopodobnie bardziej pożądane, ponieważ w ten sposób nadal otrzymujesz rozszerzenia gcc (domyślnie gcc to -std = gnu89, jednak w kilku następnych wersjach
zmieni się to na gnu99

3
@ Spudd86: To, czy chcesz włączyć rozszerzenia gcc, zależy od tego, co robisz. Wyłączenie ich jest pomocne, jeśli Twoim celem jest napisanie kodu, który jest przenośny dla kompilatorów innych niż gcc.
Keith Thompson

21

Aby przejść do trybu C99 w CodeBlocks , wykonaj następujące kroki:

Kliknij Opcje projektu / kompilacji , a następnie w zakładce Ustawienia kompilatora wybierz pod zakładkę Inne opcje i umieść -std=c99w polu tekstowym i kliknij OK .

Spowoduje to włączenie trybu C99 dla Twojego kompilatora.

Mam nadzieję, że to komuś pomoże!


Pomogło to w blokach kodu 16.1 w opcjach innego kompilatora ! Chociaż użyłem, -std=gnu99jak pokazano w niektórych odpowiedziach powyżej!
Ankur Shah,

Ale to chwilowo pomogło! Muszę to robić za każdym razem, gdy kompiluję kod! ... :(
Ankur Shah,

Nie, nie masz! Należy to zrobić dla każdego nowego projektu tylko raz.
akelec

14

Otrzymałem również ten błąd.

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

nie obowiązuje w standardzie C89 / C90. Jak mówi OysterD, musisz zrobić:

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

Twój oryginalny kod jest dozwolony w C99 i późniejszych standardach języka C.


3
W przypadku gcc wpisz „-std = c99”. Aby uzyskać dodatkowe funkcje, zobacz odpowiedź Imrana.
Matt J,

Tak, to jest ważne C; to po prostu nie jest poprawne C89 / C90.
Keith Thompson

@KeithThompson: wyjaśniono.
Blorgbeard wychodzi

Nadal mówisz, że to nie jest ważne C, tylko z kwalifikacją. To jest całkowicie poprawne C; standard z 1999 r. zastąpił i zastąpił standard z 1990 r., a standard z 2011 r. zastąpił i zastąpił standard z 1999 r. (chociaż ten drugi nie istniał, gdy pierwotnie opublikowałeś tę odpowiedź).
Keith Thompson,

@KeithThompson Cóż, nie o tym myślałem, że mówię. Czy uważasz, że „nie jest prawidłowy w standardzie C89 / C90”?
Blorgbeard wyszedł

13

@Blorgbeard :

Nowe funkcje w C99

  • funkcje inline
  • deklaracja zmiennej nie jest już ograniczona do zakresu pliku lub początku instrukcji złożonej
  • kilka nowych typów danych, w tym long long int, opcjonalne rozszerzone typy liczb całkowitych, jawny typ danych logicznych i typ złożony do reprezentowania liczb zespolonych
  • tablice o zmiennej długości
  • obsługa jednowierszowych komentarzy zaczynających się od //, jak w BCPL lub C ++
  • nowe funkcje biblioteczne, takie jak snprintf
  • nowe pliki nagłówkowe, takie jak stdbool.h i inttypes.h
  • Typowe funkcje matematyczne (tgmath.h)
  • ulepszona obsługa zmiennoprzecinkowych IEEE
  • wyznaczone inicjatory
  • złożone literały
  • wsparcie dla makr wariadycznych (makra o zmiennej aryczności)
  • ogranicz kwalifikacje, aby umożliwić bardziej agresywną optymalizację kodu

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

Wycieczka po C99



3

Dla każdego, kto próbuje skompilować kod z zewnętrznego źródła, które używa zautomatyzowanego narzędzia do kompilacji, takiego jak Make , aby uniknąć konieczności śledzenia jawnych wywołań kompilacji gcc, można ustawić zmienną środowiskową. Wpisz w wierszu polecenia lub wstaw .bashrc (lub .bash_profile na Macu):

export CFLAGS="-std=c99"

Zauważ, że podobne rozwiązanie ma zastosowanie, jeśli napotkasz podobny scenariusz z kompilacją C ++, która wymaga C ++ 11, możesz użyć:

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

1

Miałem ten sam problem i działa, musisz tylko zadeklarować izewnętrzną część pętli:

int i;

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

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

}

1

Jihene Stambouli odpowiedziała na pytanie OP najbardziej bezpośrednio… Pytanie brzmiało; dlaczego

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

spowodować błąd;

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

na który odpowiedź brzmi

for(int i = low...

Powinien być

int i;
for (i=low...

1

Włącz tryb C99 w Code :: Blocks 16.01

  • Idź do Ustawienia -> Kompilator ...
  • W sekcji Flagi kompilatora na karcie Ustawienia kompilatora zaznacz pole wyboru „ Niech gcc przestrzega normy językowej 1999 ISO C [-std = c99]

0

Dla Qt-creator: po prostu dodaj kolejne wiersze do pliku * .pro ...

QMAKE_CFLAGS_DEBUG = \
    -std=gnu99

QMAKE_CFLAGS_RELEASE = \
    -std=gnu99
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.