2009-08-17 2 views
28

누군가 다음 gcc 오류에 대해 자세히 설명해 줄 수 있습니까?C : for 루프 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);   
    } 
} 

P.S : 나는 막연하게 int ifor 루프 전에 선언해야 함을 기억합니다. 나는 C 표준에 대한 역사적인 맥락을 제시하는 대답을 찾고 있다고 언급해야한다.

+2

자세한 내용은 C 변수 선언과 관련된 이전 질문을 확인하십시오. http://stackoverflow.com/questions/288441/variable-declaration-placement-in-c –

답변

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

은 C99에 도입 된 구문입니다. 이것을 사용하려면 -std=c99 (또는 이후의 표준)을 GCC에 전달하여 C99 모드를 활성화해야합니다. C89 버전은 다음과 같습니다

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

편집

역사적으로, C 언어는 항상 블록의 시작에 모든 변수를 선언 할 프로그래머를 강요했다. 그래서 뭔가 같은 :

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

은 다음과 같이 다시 작성해야합니다 :

C99

block := '{' declarations statements '}' 
, C++, C# 및 자바 어디에서 변수 선언을 허용 :

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

블록은 다음과 같이 정의된다 블록.

진짜 추론 (추측)은 다른 컴파일러 단계를 거치지 않고 C 소스를 파싱하는 동안 가능한 빨리 스택 크기 계산과 같은 내부 구조를 할당하는 것입니다.

+3

참고 : c99 버전을 사용할 때 선언 된 변수가 for-loop 블록에 대해 국지적이며 이후에 범위를 벗어 났을 때 존재하지 않는다는 사실을 잊지 마십시오. – ely

+1

역사적인 관심사 일 수있는 추가 메모. C99 표준 이전의이 규칙을 둘러싼 한 가지 방법은 블록 내에 블록을 만드는 것이 었습니다. 블록 중간에 변수를 선언하고 bracers를 더 많이 사용하는 코드를 둘러싸면 { –

+0

예를 들어 GCC의 새 버전에서는 C의 기본 버전이 다음과 같이 업데이트됩니다. 좀 더 업데이트 된 버전이 나면 C89 -> 그래서이 모든 문제는 처음에는 컴파일 오류가 발생하지 않을 것입니다 ... (우분투 16.04에서 gcc 5.4.0을 사용하고 있으며 컴파일 스 에러가 없습니다. 암호). –

8

C99 이전에는 블록 시작 부분에 로컬 변수를 정의해야했습니다. C99에서는 로컬 변수 정의와 지침을 혼용 할 수있는 C++ 기능을 가져 왔으며 forwhile 제어 표현식에서 변수를 정의 할 수 있습니다.