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?

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 .


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.


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!


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.


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



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"

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;
        }

}

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...

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] '

0

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

QMAKE_CFLAGS_DEBUG = \
    -std=gnu99

QMAKE_CFLAGS_RELEASE = \
    -std=gnu99
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.