2012-03-01 2 views
2

나는 ANSI C에서이 작업을 수행하려고 :이은 (은 ANSI C 프로젝트) 마이크로 소프트 Visual C++ 2010에서 작동하지 않습니다범위 시작 부분에 C89 로컬 변수를 선언 하시겠습니까?

include <stdio.h> 
int main() 
{ 
    printf("%d", 22); 
    int j = 0; 
    return 0; 
} 

.

error C2143: syntax error : missing ';' before 'type' 

이 작동합니까 :.

include <stdio.h> 
int main() 
{ 
    int j = 0; 
    printf("%d", 22); 
    return 0; 
} 

지금 난 당신이 변수에 존재하는 코드 블록의 시작 부분에 변수를 선언 할 필요가 많은 장소에서 읽기이 일반적으로 당신은 오류가 ANSI C89에 대해 사실입니까?

사람들이이 조언을 해주는 많은 포럼을 발견했지만 GNU C 매뉴얼과 같은 '공식'출처에서 작성된 내용은 본 적이 없습니다.

답변

3

ANSI C89에서는 범위 시작 부분에 변수를 선언해야합니다. 이것은 C99에서 편안하게됩니다.

-pedantic 플래그를 사용하면 표준 규칙이보다 엄격하게 적용됩니다 (기본값은 C89 모드이므로) gcc 플래그가있는 것이 확실합니다.

참고하지만,이 유효한 C89 코드입니다 :

include <stdio.h> 
int main() 
{ 
    int i = 22; 
    printf("%d\n", i); 
    { 
     int j = 42; 
     printf("%d\n", j); 
    } 
    return 0; 
} 

그러나 범위 (그 범위에서 변수 때문에 수명)을 나타 내기 위해 괄호를 사용하는 것은 특히 인기가 될 것 같지 않습니다, 따라서 C99 ...

3

이것은 C89에서 절대적으로 해당됩니다. 컴파일러는 컴파일러가 지원하는 언어와 ANSI C 사이의 차이점 만 문서화합니다.)

그러나 많은 "C89"컴파일러를 사용하면 컴파일러가 엄격 모드에 있지 않은 한 블록의 거의 모든 위치에 변수 선언을 넣으십시오. 여기에는 GCC가 포함되며 엄격한 모드 인 -pedantic을 사용할 수 있습니다. Clang의 기본값은 C99 타겟이므로 -pedantic은 변수 선언과 코드를 함께 사용할 수 있는지 여부에 영향을 미치지 않습니다.

MSVC는 C에 대한 지원이 다소 부족합니다. 두려웠습니다. 몇 가지 확장명을 가진 C89 (old!) 만 지원합니다.

2

Now I read at many places that you have to declare variables in the beginning of the code block the variables exist in. Is this generally true for ANSI C 89?

예,이는 C89/C90 표준에 복합 명령문의 구문에 요구되는 등 :

(C90, 6.6.2 Compound statement, or block)

Syntax

compound-statement

{ declaration-list_opt statement-list_opt }

블록 내에서 문 앞에 선언은 이어야합니다.

C99은 블록에서 선언문과 명령문을 혼합하여 이것을 완화했습니다. C99 표준에서 :

(C99, 6.8.2 Compound statement)

Syntax

compound-statement:

{ block-item-list_opt }

block-item-list:

block-item

block-item-list block-item

block-item:

declaration

statement

관련 문제