ฉันจะแก้ไขข้อผิดพลาด GCC“ สำหรับการประกาศเริ่มต้นของลูปที่ใช้นอกโหมด C99” ได้อย่างไร


117

ฉันกำลังพยายามแก้ปัญหา3n + 1และฉันมีforลูปที่มีลักษณะดังนี้:

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

        }

น่าเสียดายที่ฉันได้รับข้อผิดพลาดนี้เมื่อพยายามรวบรวมกับ GCC:

3np1.c: 15: ข้อผิดพลาด: การประกาศเริ่มต้นของลูป 'สำหรับ' ที่ใช้นอกโหมด C99

ผมไม่รู้ว่าโหมด C99 คืออะไร ความคิดใด ๆ ?

คำตอบ:


149

ฉันจะพยายามประกาศiนอกวง!

ขอให้โชคดีในการแก้ 3n + 1 :-)

นี่คือตัวอย่าง:

#include <stdio.h>

int main() {

   int i;

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

   return 0;
}

อ่านเพิ่มเติมเกี่ยวกับสำหรับลูปใน C ที่นี่


แล้วทำไมคุณไม่ใช้ while loop แทนล่ะ?
Erik W

3
@ErikW คำถามของคุณแย่มาก
user25

119

มีสวิตช์คอมไพเลอร์ที่เปิดใช้งานโหมด C99ซึ่งเหนือสิ่งอื่นใดอนุญาตให้ประกาศตัวแปรภายในลูป for หากต้องการเปิดใช้สวิตช์คอมไพเลอร์-std=c99

หรือตามที่ @OysterD บอกให้ประกาศตัวแปรนอกลูป


7
จริงๆแล้ว -std = gnu99 น่าจะเป็นที่ต้องการมากกว่าเนื่องจากวิธีนี้คุณยังคงได้รับส่วนขยาย gcc (ค่าเริ่มต้นของ gcc เป็น -std = gnu89 อย่างไรก็ตามสิ่งนี้จะเปลี่ยนเป็น gnu99 ในบางช่วงของเวอร์ชันถัดไป)
Spudd86

4
@ Spudd86: คุณต้องการเปิดใช้งานส่วนขยาย gcc หรือไม่นั้นขึ้นอยู่กับสิ่งที่คุณกำลังทำอยู่ การปิดใช้งานจะมีประโยชน์หากเป้าหมายของคุณคือการเขียนโค้ดที่พกพาไปยังคอมไพเลอร์อื่นที่ไม่ใช่ gcc
Keith Thompson

21

หากต้องการเปลี่ยนเป็นโหมดC99ในCodeBlocksให้ทำตามขั้นตอนต่อไป:

คลิกโครงการ / ตัวเลือกรูปร่างแล้วในแท็บการตั้งค่าคอมไพเลอร์เลือกแท็บย่อยตัวเลือกอื่น ๆและสถานที่-std=c99ในพื้นที่ข้อความและคลิกตกลง

สิ่งนี้จะเปิดโหมดC99สำหรับคอมไพเลอร์ของคุณ

ฉันหวังว่านี่จะช่วยใครสักคน!


สิ่งนี้ช่วยใน codeblocks 16.1 ภายใต้ตัวเลือกคอมไพเลอร์อื่น ๆ ! แม้ว่าฉันจะใช้-std=gnu99ตามที่อธิบายไว้ในคำตอบด้านบน!
Ankur Shah

แต่สิ่งนี้ช่วยได้ชั่วคราว! ฉันต้องทำสิ่งนี้ทุกครั้งที่รวบรวมโค้ด! ... :(
Ankur Shah

ไม่คุณไม่มี! สิ่งนี้ต้องทำสำหรับแต่ละโครงการใหม่เพียงครั้งเดียว
akelec

14

ฉันได้รับข้อผิดพลาดนี้เช่นกัน

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

ไม่ถูกต้องในมาตรฐาน C89 / C90 ตามที่ OysterD กล่าวคุณต้องทำ:

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

รหัสเดิมของคุณได้รับอนุญาตใน C99 และมาตรฐานที่ใหม่กว่าของภาษา C


3
สำหรับ gcc ให้ใส่ "-std = c99" สำหรับคุณสมบัติเพิ่มเติมโปรดดูคำตอบของ Imran
Matt J

ใช่มันถูกต้อง C; มันไม่ถูกต้อง C89 / C90
Keith Thompson

@KeithThompson: ชี้แจง
Blorgbeard ออกใน

คุณยังคงบอกว่าไม่ใช่ C ที่ถูกต้องมีเพียงวุฒิการศึกษาเท่านั้น มันถูกต้องอย่างสมบูรณ์ C; มาตรฐานปี 1999 แทนที่และแทนที่มาตรฐานปี 1990 และมาตรฐานปี 2011 แทนที่และแทนที่มาตรฐานปี 1999 (แม้ว่าจะไม่มีอยู่ในตอนแรกที่คุณโพสต์คำตอบนี้)
Keith Thompson

@KeithThompson อืมนั่นไม่ใช่สิ่งที่ฉันคิดว่าฉันพูด คุณจะพิจารณาว่า "ไม่ถูกต้องในมาตรฐาน C89 / C90" ถูกต้องหรือไม่
Blorgbeard ออกใน

13

@Blorgbeard :

คุณสมบัติใหม่ใน C99

  • ฟังก์ชันแบบอินไลน์
  • การประกาศตัวแปรไม่ จำกัด ขอบเขตไฟล์หรือจุดเริ่มต้นของคำสั่งผสมอีกต่อไป
  • ประเภทข้อมูลใหม่หลายประเภทรวมถึง int long long ประเภทจำนวนเต็มขยายที่เป็นทางเลือกประเภทข้อมูลบูลีนที่ชัดเจนและประเภทที่ซับซ้อนเพื่อแสดงจำนวนเชิงซ้อน
  • อาร์เรย์ที่มีความยาวผันแปรได้
  • รองรับความคิดเห็นหนึ่งบรรทัดที่ขึ้นต้นด้วย // เช่นเดียวกับ BCPL หรือ C ++
  • ฟังก์ชันไลบรารีใหม่เช่น snprintf
  • ไฟล์ส่วนหัวใหม่เช่น stdbool.h และ inttypes.h
  • ประเภท - ฟังก์ชันคณิตศาสตร์ทั่วไป (tgmath.h)
  • ปรับปรุงการรองรับ IEEE floating point
  • initializers ที่กำหนด
  • ตัวอักษรผสม
  • รองรับมาโครตัวแปร (มาโครของตัวแปร arity)
  • จำกัด คุณสมบัติเพื่ออนุญาตการเพิ่มประสิทธิภาพโค้ดเชิงรุกมากขึ้น

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

ทัวร์ C99


6

ถ้าคุณรวบรวมใน C เปลี่ยน

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

ถึง

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

คุณยังสามารถคอมไพล์ด้วยชุดสวิตช์ C99 ใส่ -std = c99 ในบรรทัดคอมไพล์:

gcc -std=c99 foo.c -o foo

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


3

สำหรับใครก็ตามที่พยายามคอมไพล์โค้ดจากซอร์สภายนอกที่ใช้ยูทิลิตี้บิลด์อัตโนมัติเช่นMakeเพื่อหลีกเลี่ยงการติดตามการเรียกคอมไพล์ gcc ที่ชัดเจนคุณสามารถตั้งค่าตัวแปรสภาพแวดล้อมได้ ป้อนพร้อมรับคำสั่งหรือใส่. bashrc (หรือ. bash_profile บน Mac):

export CFLAGS="-std=c99"

โปรดทราบว่าวิธีการแก้ปัญหาที่คล้ายกันจะใช้หากคุณพบสถานการณ์ที่คล้ายกันกับการคอมไพล์ C ++ ที่ต้องใช้ C ++ 11 คุณสามารถใช้:

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

1

ฉันมีปัญหาเดียวกันและได้ผลคุณเพียงแค่ประกาศiนอกวง:

int i;

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

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

}

1

Jihene Stambouli ตอบคำถาม OP ได้ตรงที่สุด ... คำถามคือ; ทำไม

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

สร้างข้อผิดพลาด

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

ซึ่งคำตอบคือ

for(int i = low...

ควรจะเป็น

int i;
for (i=low...

1

เปิดใช้งานโหมด C99 ใน Code :: Blocks 16.01

  • ไปที่ การตั้งค่า ->คอมไพเลอร์ ...
  • ในส่วนCompiler Flagsของแท็บCompiler settingsให้เลือกช่องทำเครื่องหมาย ' Have gcc follow the 1999 ISO C language standard [-std = c99] '

0

สำหรับ Qt-creator: เพียงเพิ่มบรรทัดถัดไปในไฟล์ * .pro ...

QMAKE_CFLAGS_DEBUG = \
    -std=gnu99

QMAKE_CFLAGS_RELEASE = \
    -std=gnu99
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.