C 및 C++에 대한 Microsoft 확장

MSVC(Microsoft Visual C++)는 이 문서에 자세히 설명된 여러 가지 방법으로 C 및 C++ 언어 표준을 확장합니다.

MSVC C++ 컴파일러는 기본적으로 일부 ISO C++17 기능과 일부 Microsoft 특정 언어 확장을 사용하여 ISO C++14를 지원합니다. 지원되는 기능에 대한 자세한 내용은 Visual Studio 버전별 Microsoft C/C++ 언어 규격을 참조하세요. 컴파일러 옵션을 사용하여 /std ISO C++17 및 ISO C++20 언어 기능에 대한 전체 지원을 사용하도록 설정할 수 있습니다. 자세한 내용은 (언어 표준 버전 지정)을 참조 /std 하세요.

지정된 경우 컴파일러 옵션을 사용하여 /Za 일부 MSVC C++ 언어 확장을 사용하지 않도록 설정할 수 있습니다. Visual Studio 2017 이상 버전 /permissive- 에서 컴파일러 옵션은 Microsoft 특정 C++ 언어 확장을 사용하지 않도록 설정합니다. /permissive- 컴파일러 옵션은 컴파일러 옵션 및 /std:c++latest 컴파일러 옵션에서 /std:c++20 암시적으로 사용하도록 설정됩니다.

기본적으로 MSVC는 코드를 C로 컴파일할 때 Microsoft 특정 언어 확장을 사용하여 ANSI C89를 구현합니다. 이러한 MSVC 확장 중 일부는 ISO C99 이상에서 표준화됩니다. 이 문서의 뒷부분에 설명된 대로 대부분의 MSVC C 확장은 컴파일러 옵션을 사용하여 /Za 사용하지 않도록 설정할 수 있습니다. 컴파일러 옵션을 사용하여 /std ISO C11 및 C17을 지원할 수 있습니다. 자세한 내용은 (언어 표준 버전 지정)을 참조 /std 하세요.

표준 C 런타임 라이브러리는 Windows의 UCRT(유니버설 C 런타임 라이브러리)에 의해 구현됩니다. UCRT는 또한 많은 POSIX 및 Microsoft 관련 라이브러리 확장을 구현합니다. UCRT는 특정 구현별 주의 사항과 함께 ISO C11 및 C17 C 런타임 라이브러리 표준을 지원합니다. 전체 ISO C99 표준 C 런타임 라이브러리는 지원하지 않습니다. 자세한 내용은 유니버설 C 런타임 라이브러리 설명서의 호환성을 참조하세요.

키워드

MSVC는 C 및 C++에 여러 Microsoft 관련 키워드(keyword) 추가합니다. 키워드 목록에서 두 개의 선행 밑줄이 있는 키워드(keyword) MSVC 확장입니다.

캐스트

C++ 컴파일러와 C 컴파일러는 모두 다음과 같은 종류의 비표준 캐스트를 지원합니다.

  • C 컴파일러는 l 값을 생성하는 비표준 캐스트를 지원합니다. 예시:

    char *p;
    (( int * ) p )++;
    // In C with /W4, both by default and under /Ze:
    //     warning C4213: nonstandard extension used: cast on l-value
    // Under /TP or /Za:
    //     error C2105: '++' needs l-value
    

    참고 항목

    이 확장은 C 언어에서만 사용할 수 있습니다. C++ 코드에서 다음 C 표준 양식을 사용하여 포인터가 다른 형식에 대한 포인터인 것처럼 수정할 수 있습니다.

    앞의 예제는 C 표준을 준수하기 위해 다음과 같이 다시 작성할 수 있습니다.

    p = ( char * )(( int * )p + 1 );
    
  • C 및 C++ 컴파일러는 모두 데이터 포인터에 대한 함수 포인터의 비표준 캐스트를 지원합니다. 예시:

    int ( * pfunc ) ();
    int *pdata;
    pdata = ( int * ) pfunc;
    /* No diagnostic at any level, whether compiled with default options or under /Za */
    

가변 길이 인수 목록

C 및 C++ 컴파일러 모두 가변 개수의 인수를 지정하는 함수 선언자를 지원하며, 그 다음에는 형식을 대신 제공하는 함수 정의가 있습니다.

void myfunc( int x, ... );
void myfunc( int x, char * c )
{ }
// In C with /W4, either by default or under /Ze:
//     warning C4212: nonstandard extension used: function declaration used ellipsis
// In C with /W4, under /Za:
//     warning C4028: formal parameter 2 different from declaration
// In C++, no diagnostic by default or under /Za.

한 줄로 된 주석

C 컴파일러는 두 개의 슬래시(//) 문자를 사용하여 도입된 단일 줄 주석 지원합니다.

// This is a single-line comment.

단일 줄 주석 C99 기능입니다. 영향을 받지 않으며 /Za 어떤 수준에서도 진단을 일으키지 않습니다.

Scope

C 컴파일러는 다음과 같은 범위 관련 기능을 지원합니다.

  • 항목을 다음과 같이 static다시 정의합니다.extern

    extern int clip();
    static int clip() {}
    // In C and C++ with /W4, either by default or under /Ze:
    //     warning C4211: nonstandard extension used: redefined extern to static
    // In C and C++ under /Za:
    //     error C2375: 'clip': redefinition; different linkage
    
  • 동일한 범위 내에서 무해한 typedef 재정의 사용:

    typedef int INT;
    typedef int INT; // No diagnostic at any level in C or C++
    
  • 함수 선언자에는 파일 범위가 있습니다.

    void func1()
    {
         extern double func2( double );
         // In C at /W4:  warning C4210: nonstandard extension used: function given file scope
    }
    int main( void )
    {
         func2( 4 );    //  /Ze passes 4 as type double
    }                  //  /Za passes 4 as type int
    
  • 비 상수 식을 사용하여 초기화되는 블록 범위 변수 사용:

    int clip( int );
    int bar( int );
    int main( void )
    {
         int array[2] = { clip( 2 ), bar( 4 ) };
    }
    int clip( int x )
    {
         return x;
    }
    int bar( int x )
    {
         return x;
    }
    

데이터 선언 및 정의

C 컴파일러는 다음과 같은 데이터 선언 및 정의 기능을 지원합니다.

  • 이니셜라이저의 혼합 문자 및 문자열 상수:

    char arr[6] = {'a', 'b', "cde"};
    // In C with /W4, either by default or under /Ze:
    //     warning C4207: nonstandard extension used: extended initializer form
    // Under /Za:
    //     error C2078: too many initializers
    
  • 기본 형식이 아닌 unsigned int 비트 필드 또는 signed int.

  • 형식을 포함하지 않는 선언자:

    x;
    // By default or under /Ze, /Za, /std:c11, and /std:c17, when /W4 is specified:
    //     warning C4431: missing type specifier - int assumed. Note: C no longer supports default-int
    //     warning C4218: nonstandard extension used: must specify at least a storage class or a type
    */
    int main( void )
    {
         x = 1;
    }
    
  • 구조체 및 공용 구조체의 마지막 필드로 크기가 조정되지 않은 배열:

    struct zero
    {
         char *c;
         int zarray[];
         // In C with /W4, either by default, under /Ze, /std:c11, and /std:c17:
         //     warning C4200: nonstandard extension used: zero-sized array in struct/union
         // Under /Za:
         //     error C2133: 'zarray': unknown size
    };
    
  • 명명되지 않은(익명) 구조체:

    struct
    {
         int i;
         char *s;
    };
    // By default or under /Ze, /std:c11, and /std:c17, when /W4 is specified:
    //     warning C4094: untagged 'struct' declared no symbols
    // Under /Za:
    //     error C2059: syntax error: 'empty declaration'
    
  • 명명되지 않은(익명) 공용 구조체:

    union
    {
         int i;
         float fl;
    };
    // By default or under /Ze, /std:c11, and /std:c17, when /W4 is specified:
    //     warning C4094: untagged 'union' declared no symbols
    // Under /Za:
    //     error C2059: syntax error: 'empty declaration'
    

내장 부동 소수점 함수

x86 C++ 컴파일러와 C 컴파일러는 모두 지정된 경우 /Oi ,atan2, cos,exp, log, sqrtlog10sin, 및 tan 함수의 atan인라인 생성을 지원합니다. 이러한 내장 함수는 변수를 설정 errno 하지 않으므로 표준을 준수하지 않습니다.

ISO646.H 사용하도록 설정되지 않음

아래에서 /Ze다음 연산자의 텍스트 형식을 사용하려는 경우 포함 iso646.h 해야 합니다.

작업 텍스트 양식
&& and
&= and_eq
& bitand
| bitor
~ compl
! not
!= not_eq
|| or
|= or_eq
^ xor
^= xor_eq

이러한 텍스트 양식은 C++ 키워드(keyword) /Za 지정되거나 묵시적일 때 /permissive- 사용할 수 있습니다.

참고 항목

/Za, /Ze (언어 확장 사용 안 함)
MSVC 컴파일러 옵션
MSVC 컴파일러 명령줄 구문