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 관련 키워드를 추가합니다. 키워드 목록에서 두 개의 선행 밑줄이 있는 키워드는 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
어떤 수준에서도 진단을 일으키지 않습니다.
범위
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
, sqrt
log10
sin
, 및 tan
함수의 atan
인라인 생성을 지원합니다. 이러한 내장 함수는 변수를 설정 errno
하지 않으므로 표준을 준수하지 않습니다.
ISO646.H
사용하도록 설정되지 않음
아래에서 /Ze
다음 연산자의 텍스트 형식을 사용하려는 경우 포함 iso646.h
해야 합니다.
연산자 | 텍스트 양식 |
---|---|
&& |
and |
&= |
and_eq |
& |
bitand |
| |
bitor |
~ |
compl |
! |
not |
!= |
not_eq |
|| |
or |
|= |
or_eq |
^ |
xor |
^= |
xor_eq |
이러한 텍스트 양식은 C++ 키워드 아래 /Za
또는 지정되거나 묵시적일 때 /permissive-
사용할 수 있습니다.