2012-10-28 6 views
3

C11 표준 (C++ 11은 함수의 어느 위치에서나 변수를 선언 할 수 있습니까?) 아래C11은 함수의 어느 위치에서나 변수 선언을 허용합니까?

코드 ANSI C (C89, C90)에서 유효하지 :

int main() 
{ 
    printf("Hello world!"); 
    int a = 5; /* Error: all variables should be declared at the beginning of the function. */ 
    return 0; 
} 

는 C11에서 유효한 소스 코드는?

+0

왜 ANSI C가 유효하지 않습니까? ANSI는 C99을 따르기 위해 국가 표준을 어떻게 든 업데이트하지 않았습니까? –

+2

ANSI C가 무엇을 의미하는지 정확하게 이해한다면 Is는 유효한 ANSI C입니다. ANSI는 가장 최신 버전으로 잘 업데이트됩니다. 불행하게도 도시 속어에서 "ANSI C"라는 용어는 C 89에 잘못 붙어 있습니다. –

+4

@JensGustedt : ANSI C는 실제로 C89 였지만 1990 년 이래 ISO C가 표준이었고 ANSI는이를지지했습니다 ISO C를 표준으로 사용합니다. ISO C 90과 ANSI C 89의 차이점은 섹션 번호 매기기 AFAIK에 있습니다. 그렇지 않으면 텍스트가 변경되지 않았습니다. 그러나 그것은 쪼개지는 머리카락입니다. GCC는'-std = c89'의 동의어로'-ansi'를 사용하고'-std = c90'을 인식하지 못합니다 (그러나 GCC의 대부분의 버전은'std = c99'를 인식하고 최근의 것들은'-std = c11'을 인식합니다.). POSIX는 'c89' C 컴파일러를 요구했습니다. 'c99' 컴파일러가 필요합니다. 왜냐하면 아직 수정되지 않았기 때문입니다. –

답변

7

예. 이것은 C99에서 이미 유효합니다 (두 번째 글 머리표 here 참조).

3

다소 차이가 있습니다. C99에서는 블록을 통해 부분적으로 변수를 선언 할 수있는 기능을 도입했으며 for 루프의 첫 번째 섹션에서 C2011이이를 계속 수행했습니다.

void c99_or_later(int n, int *x) 
{ 
    for (int i = 0; i < n; i++) // C99 or later 
    { 
     printf("x[%d] = %d\n", i, x[i]); 
     int t = x[i];   // C99 or later 
     x[0] = x[i]; 
     x[i] = t; 
    } 
} 

C++ 스타일의 꼬리말 주석은 C99 이상에서만 유효합니다.

C99과 호환되지 않는 C 컴파일러 (예 : MSVC)를 처리해야하는 경우 이러한 (편리한) 표기법을 사용할 수 없습니다. GCC는 유용한 경고 플래그 인 -Wdeclaration-after-statement을 제공합니다.