2009-08-17 44 views
28

Ai đó có thể giải thích về lỗi gcc sau đây không?C: đối với khai báo ban đầu vòng lặp int

$ gcc -o Ctutorial/temptable.out temptable.c 
temptable.c: In function ‘main’: 
temptable.c:5: error: ‘for’ loop initial declaration used outside C99 mode 

temptable.c:

... 
/* print Fahrenheit-Celsius Table */ 
main() 
{ 
    for(int i = 0; i <= 300; i += 20) 
    { 
     printf("F=%d C=%d\n",i, (i-32)/9);   
    } 
} 

Tái bút: Tôi mơ hồ nhớ lại rằng int i cần được khai báo trước khi một vòng lặp for. Tôi nên nói rằng tôi đang tìm kiếm một câu trả lời cho một bối cảnh lịch sử của tiêu chuẩn C.

+2

Kiểm tra câu hỏi trước đây liên quan đến khai báo biến C để biết thêm thông tin: http://stackoverflow.com/questions/288441/variable-declaration-placement-in-c –

Trả lời

59
for (int i = 0; ...) 

là cú pháp được giới thiệu trong C99. Để sử dụng nó, bạn phải bật chế độ C99 bằng cách đi qua -std=c99 (hoặc một số tiêu chuẩn sau này) cho GCC. Phiên bản C89 là:

int i; 
for (i = 0; ...) 

EDIT

Về mặt lịch sử, ngôn ngữ C luôn buộc các lập trình viên phải khai báo tất cả các biến tại bắt đầu của một khối. Vì vậy, một cái gì đó như:

{ 
    printf("%d", 42); 
    int c = 43; /* <--- compile time error */ 

phải được viết lại như sau:

{ 
    int c = 43; 
    printf("%d", 42); 

một khối được định nghĩa là:

block := '{' declarations statements '}' 

C99, C++, C# và Java cho phép khai báo các biến bất cứ nơi nào trong một khối.

Lý do thực sự (phỏng đoán) là phân bổ cấu trúc bên trong (như tính toán kích thước ngăn xếp) càng sớm càng tốt trong khi phân tích cú pháp nguồn C, mà không cần đến một trình biên dịch khác.

+3

Chỉ cần lưu ý: khi sử dụng phiên bản c99, don Đừng quên rằng biến được khai báo là cục bộ đối với khối vòng lặp, và sẽ không tồn tại sau đó, khi nó đã biến mất khỏi phạm vi. – ely

+1

Một lưu ý bổ sung có thể là sở thích lịch sử. Một cách xung quanh quy tắc này trước tiêu chuẩn C99 đã tạo ra một khối trong một khối. Bạn sẽ khai báo một biến ở giữa một khối, và bao quanh nó và mã đã sử dụng nó với nhiều bracers {} –

+0

Nó cũng đáng nói đến, ví dụ, trên các phiên bản mới của GCC, phiên bản mặc định của C được cập nhật thành một phiên bản cập nhật hơn sau đó C89 -> vì vậy toàn bộ vấn đề này tạo ra một lỗi biên dịch ở nơi đầu tiên ... (Tôi đang sử dụng gcc 5.4.0 trên Ubuntu 16.04 và không có bất kỳ lỗi biên dịch nào không cảnh báo cho đoạn mã này mã). –

8

Trước C99, bạn phải xác định các biến cục bộ ở đầu khối. C99 đã nhập tính năng C++ mà bạn có thể kết hợp các định nghĩa biến cục bộ với các hướng dẫn và bạn có thể xác định các biến trong các biểu thức điều khiển forwhile.

Các vấn đề liên quan