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.