Bagaimana cara memperbaiki kesalahan GCC "untuk deklarasi awal loop yang digunakan di luar mode C99"?

117

Saya mencoba menyelesaikan masalah 3n + 1 dan saya memiliki forloop yang terlihat seperti ini:

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

        }

Sayangnya saya mendapatkan kesalahan ini ketika mencoba mengompilasi dengan GCC:

3np1.c: 15: error: 'for' deklarasi awal loop digunakan di luar mode C99

Saya tidak tahu apa itu mode C99. Ada ide?

The.Anti.9
sumber

Jawaban:

149

Saya akan mencoba untuk menyatakan di iluar lingkaran!

Semoga berhasil menyelesaikan 3n + 1 :-)

Berikut contohnya:

#include <stdio.h>

int main() {

   int i;

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

   return 0;
}

Baca lebih lanjut untuk loop di C di sini .

OysterD
sumber
lalu mengapa Anda tidak menggunakan while loop saja?
Erik W
3
@ErikW pertanyaan Anda sangat buruk
pengguna25
119

Ada sakelar kompiler yang mengaktifkan mode C99 , yang antara lain mengizinkan deklarasi variabel di dalam perulangan for. Untuk menyalakannya gunakan saklar kompilator-std=c99

Atau seperti yang dikatakan @OysterD, deklarasikan variabel di luar loop.

JamesSugrue
sumber
7
sebenarnya -std = gnu99 mungkin lebih diinginkan karena dengan cara itu Anda masih mendapatkan ekstensi gcc (gcc defaults ke -std = gnu89, namun ini akan berubah menjadi gnu99 di beberapa titik dalam beberapa versi berikutnya)
Spudd86
4
@ Spudd86: Apakah Anda ingin mengaktifkan ekstensi gcc bergantung pada apa yang Anda lakukan. Menonaktifkannya berguna jika tujuan Anda adalah menulis kode yang portabel untuk kompiler selain gcc.
Keith Thompson
21

Untuk beralih ke mode C99 di CodeBlocks , ikuti langkah-langkah selanjutnya:

Klik Project / Build options , lalu di tab Compiler Settings pilih subtab Other options , dan tempatkan -std=c99di area teks, dan klik Ok .

Ini akan mengubah C99 mode untuk Compiler Anda.

Saya harap ini akan membantu seseorang!

akelec
sumber
Ini membantu dalam blok kode 16.1 di bawah opsi Kompilator Lainnya ! Padahal saya digunakan -std=gnu99seperti yang digambarkan dalam beberapa jawaban di atas!
Ankur Shah
Tapi ini membantu sementara! Saya harus melakukan ini setiap kali saya mengkompilasi kode! ... :(
Ankur Shah
Tidak, belum! Ini harus dilakukan untuk setiap proyek baru hanya sekali.
akelec
14

Saya mendapatkan kesalahan ini juga.

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

tidak valid dalam standar C89 / C90. Seperti yang dikatakan OysterD, Anda perlu melakukan:

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

Kode asli Anda diperbolehkan dalam C99 dan standar bahasa C.

Blorgbeard keluar
sumber
3
Untuk gcc, lemparkan "-std = c99". Untuk fitur tambahan, lihat jawaban Imran.
Matt J
Ya, ini valid C; hanya saja C89 / C90 tidak valid.
Keith Thompson
@Keompson: diklarifikasi.
Blorgbeard keluar
Anda masih mengatakan itu bukan C yang valid, hanya dengan kualifikasi. Ini adalah C yang sangat valid; standar 1999 menggantikan dan menggantikan standar 1990, dan standar 2011 menggantikan dan menggantikan standar 1999 (meskipun yang terakhir tidak ada saat Anda awalnya memposting jawaban ini).
Keith Thompson
@KeHompson Nah, bukan itu yang saya pikir saya katakan. Apakah Anda menganggap "tidak valid dalam standar C89 / C90" benar?
Blorgbeard keluar
13

@Tokopedia :

Fitur Baru di C99

  • fungsi sebaris
  • deklarasi variabel tidak lagi terbatas pada cakupan file atau permulaan pernyataan gabungan
  • beberapa tipe data baru, termasuk long long int, tipe extended integer opsional, tipe data boolean eksplisit, dan tipe kompleks untuk merepresentasikan bilangan kompleks
  • array dengan panjang variabel
  • dukungan untuk komentar satu baris yang diawali dengan //, seperti dalam BCPL atau C ++
  • fungsi perpustakaan baru, seperti snprintf
  • file header baru, seperti stdbool.h dan inttypes.h
  • fungsi matematika tipe-generik (tgmath.h)
  • peningkatan dukungan untuk titik mengambang IEEE
  • penginisialisasi yang ditunjuk
  • literal majemuk
  • dukungan untuk makro variadic (makro dari variabel arity)
  • batasi kualifikasi untuk memungkinkan pengoptimalan kode yang lebih agresif

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

Tur C99

Imran
sumber
6

jika Anda mengkompilasi dalam perubahan C.

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

untuk

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

Anda juga dapat mengompilasi dengan set sakelar C99. Letakkan -std = c99 di baris kompilasi:

gcc -std=c99 foo.c -o foo

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

Roberto Cuadros
sumber
3

Bagi siapa pun yang mencoba mengompilasi kode dari sumber eksternal yang menggunakan utilitas build otomatis seperti Make , untuk menghindari keharusan melacak panggilan kompilasi gcc eksplisit, Anda dapat menyetel variabel lingkungan. Masuk pada command prompt atau masukkan .bashrc (atau .bash_profile di Mac):

export CFLAGS="-std=c99"

Perhatikan bahwa solusi serupa berlaku jika Anda mengalami skenario serupa dengan kompilasi C ++ yang memerlukan C ++ 11, Anda dapat menggunakan:

export CXXFLAGS="-std=c++11"
Cerpelai
sumber
1

Saya memiliki masalah yang sama dan berhasil, Anda hanya perlu mendeklarasikan bagian iluar loop:

int i;

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

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

}
Jihene Stambouli
sumber
1

Jihene Stambouli menjawab pertanyaan OP paling langsung ... Pertanyaannya adalah; Kenapa

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

menghasilkan kesalahan;

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

yang jawabannya adalah

for(int i = low...

seharusnya

int i;
for (i=low...
Dark Burrow
sumber
1

Aktifkan mode C99 di Code :: Blocks 16.01

  • Buka Pengaturan -> Kompiler ...
  • Di bagian Compiler Flags pada tab Compiler settings , pilih kotak centang ' Minta gcc mengikuti standar bahasa ISO C 1999 [-std = c99] '
Pembayar Ahmmed
sumber
0

Untuk pembuat Qt: cukup tambahkan baris berikutnya ke file * .pro ...

QMAKE_CFLAGS_DEBUG = \
    -std=gnu99

QMAKE_CFLAGS_RELEASE = \
    -std=gnu99
demiurg_spb
sumber