Làm cách nào để sửa lỗi GCC “khai báo ban đầu cho vòng lặp được sử dụng bên ngoài chế độ C99”?


116

Tôi đang cố gắng giải quyết vấn đề 3n + 1 và tôi có một forvòng lặp giống như sau:

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

        }

Rất tiếc, tôi gặp phải lỗi này khi cố gắng biên dịch với GCC:

3np1.c: 15: error: Khai báo ban đầu của vòng lặp 'for' được sử dụng bên ngoài chế độ C99

Tôi không biết chế độ C99 là gì. Có ý kiến ​​gì không?

Câu trả lời:


148

Tôi sẽ cố gắng khai báo ibên ngoài vòng lặp!

Chúc may mắn khi giải được 3n + 1 :-)

Đây là một ví dụ:

#include <stdio.h>

int main() {

   int i;

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

   return 0;
}

Đọc thêm về các vòng lặp trong C tại đây .


vậy tại sao bạn không sử dụng vòng lặp while để thay thế?
Erik W

3
@ErikW câu hỏi của bạn rất tệ
25

118

Có một công tắc trình biên dịch cho phép chế độ C99 , trong số những thứ khác cho phép khai báo một biến bên trong vòng lặp for. Để bật nó, hãy sử dụng công tắc trình biên dịch-std=c99

Hoặc như @OysterD nói, khai báo biến bên ngoài vòng lặp.


7
thực sự -std = gnu99 có lẽ là mong muốn hơn vì cách mà bạn vẫn nhận được phần mở rộng gcc (giá trị mặc định gcc để -std = gnu89, tuy nhiên điều này sẽ được thay đổi để gnu99 tại một số điểm trong vài phiên bản tiếp theo)
Spudd86

3
@ Spudd86: Bạn có muốn bật tiện ích gcc hay không tùy thuộc vào việc bạn đang làm. Vô hiệu hóa chúng sẽ hữu ích nếu mục tiêu của bạn là viết mã có thể di động cho các trình biên dịch khác ngoài gcc.
Keith Thompson

21

Để chuyển sang chế độ C99 trong CodeBlocks , hãy làm theo các bước tiếp theo:

Nhấp vào Tùy chọn dự án / Bản dựng , sau đó trong tab Cài đặt trình biên dịch, chọn tab phụ Các tùy chọn khác , và đặt -std=c99trong vùng văn bản và nhấp vào Ok .

Thao tác này sẽ bật chế độ C99 cho Trình biên dịch của bạn.

Tôi hy vọng điều này sẽ giúp ai đó!


Điều này đã giúp ích trong codeblocks 16.1 trong các tùy chọn Trình biên dịch khác ! Mặc dù tôi đã sử dụng -std=gnu99như được mô tả trong một số câu trả lời ở trên!
Ankur Shah

Nhưng điều này đã giúp tạm thời! Tôi phải làm điều này mỗi khi tôi biên dịch mã! ... :(
Ankur Shah

Không bạn không có! Điều này phải được thực hiện cho mỗi dự án mới một lần.
akelec

14

Tôi cũng gặp lỗi này.

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

không hợp lệ trong tiêu chuẩn C89 / C90. Như OysterD nói, bạn cần làm:

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

Mã gốc của bạn được phép sử dụng trong C99 và các tiêu chuẩn mới hơn của ngôn ngữ C.


3
Đối với gcc, hãy ném nó là "-std = c99". Để biết thêm các tính năng, hãy xem câu trả lời của Imran.
Matt J

Có, nó là hợp lệ C; nó chỉ là C89 / C90 không hợp lệ.
Keith Thompson

@KeithThompson: đã làm rõ.
Blorgbeard ra mắt vào

Bạn vẫn nói rằng nó không hợp lệ C, chỉ với một bằng cấp. Nó hoàn toàn hợp lệ C; tiêu chuẩn 1999 thay thế và thay thế tiêu chuẩn 1990, và tiêu chuẩn 2011 thay thế và thay thế tiêu chuẩn 1999 (mặc dù tiêu chuẩn sau không tồn tại khi bạn đăng câu trả lời này ban đầu).
Keith Thompson

@KeithThompson Chà, đó không phải là điều tôi nghĩ. Bạn có thể coi "không hợp lệ trong tiêu chuẩn C89 / C90" đúng không?
Blorgbeard ra mắt vào

13

@Blorgbeard :

Các tính năng mới trong C99

  • hàm nội tuyến
  • khai báo biến không còn bị giới hạn trong phạm vi tệp hoặc phần bắt đầu của một câu lệnh ghép
  • một số kiểu dữ liệu mới, bao gồm int dài dài, kiểu số nguyên mở rộng tùy chọn, kiểu dữ liệu boolean rõ ràng và kiểu phức để biểu diễn số phức
  • mảng có độ dài thay đổi
  • hỗ trợ cho các nhận xét một dòng bắt đầu bằng //, như trong BCPL hoặc C ++
  • các chức năng thư viện mới, chẳng hạn như snprintf
  • tệp tiêu đề mới, chẳng hạn như stdbool.h và inttypes.h
  • hàm toán học type-generic (tgmath.h)
  • cải thiện hỗ trợ cho dấu chấm động IEEE
  • bộ khởi tạo được chỉ định
  • chữ ghép
  • hỗ trợ cho các macro đa dạng (macro có độ hiếm thay đổi)
  • hạn chế trình độ để cho phép tối ưu hóa mã tích cực hơn

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

Một chuyến tham quan C99


6

nếu bạn biên dịch trong C thay đổi

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

đến

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

Bạn cũng có thể biên dịch với bộ chuyển mạch C99. Đặt -std = c99 vào dòng biên dịch:

gcc -std=c99 foo.c -o foo

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


3

Đối với bất kỳ ai đang cố gắng biên dịch mã từ một nguồn bên ngoài sử dụng tiện ích xây dựng tự động như Make , để tránh phải theo dõi các lệnh gọi biên dịch gcc rõ ràng, bạn có thể đặt một biến môi trường. Nhập trên dấu nhắc lệnh hoặc đặt trong .bashrc (hoặc .bash_profile trên Mac):

export CFLAGS="-std=c99"

Lưu ý rằng giải pháp tương tự áp dụng nếu bạn gặp phải tình huống tương tự với quá trình biên dịch C ++ yêu cầu C ++ 11, bạn có thể sử dụng:

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

1

Tôi đã gặp vấn đề tương tự và nó hoạt động, bạn chỉ cần khai báo ibên ngoài của vòng lặp:

int i;

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

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

}

1

Jihene Stambouli đã trả lời câu hỏi OP một cách trực tiếp nhất ... Câu hỏi là; tại sao

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

tạo ra lỗi;

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

câu trả lời là

for(int i = low...

nên là

int i;
for (i=low...

1

Bật chế độ C99 trong Mã :: Khối 16.01

  • Đi tới Cài đặt -> Trình biên dịch ...
  • Trong phần Cờ trình biên dịch của tab cài đặt trình biên dịch , chọn hộp kiểm ' Yêu cầu gcc tuân theo tiêu chuẩn ngôn ngữ ISO C 1999 [-std = c99] '

0

Đối với Qt-Creator: chỉ cần thêm các dòng tiếp theo vào tệp * .pro ...

QMAKE_CFLAGS_DEBUG = \
    -std=gnu99

QMAKE_CFLAGS_RELEASE = \
    -std=gnu99
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.