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.