C 및 C++에 대한 Microsoft 확장
Visual C++ ANSI c + + 및 ANSI C 표준은 다음과 같이 확장 됩니다.
Keywords
여러 키워드 추가 됩니다.목록에서 C + + 키워드, 두 선행 밑줄이 있는 키워드 Visual C++ 확장입니다.
static const 정수 계열(또는 열거형) 멤버의 Out-of-Class 정의
표준 (/Za)에서 다음과 같이 데이터 멤버에 대 한 아웃-클래스의 정의 확인 해야 합니다.
class CMyClass {
static const int max = 5;
int m_array[max];
}
...
const int CMyClass::max; // out of class definition
/Ze를 사용하면 static const 정수 계열 및 const 열거형 데이터 멤버에 대해 선택적으로 out-of-class를 정의할 수도 있고 정의하지 않을 수도 있습니다.적분과 정적 및 const 열거형만 이니셜라이저는 클래스에서 가질 수 있습니다. 초기화 식은 상수 식 이어야 합니다.
여러 소스 파일에는 파일 및 헤더 파일 헤더에 포함 제공, 아웃-클래스를 정의 하는 경우 오류가 발생 하지 않도록 하려면 selectany.예를 들면 다음과 같습니다.
__declspec(selectany) const int CMyClass::max = 5;
캐스트
컴파일러는 이러한 종류의 비 ANSI 캐스트를 지원합니다.
비 ANSI 캐스트 l 값을 생성 합니다.예를 들면 다음과 같습니다.
char *p; (( int * ) p )++;
[!참고]
이 확장은 C 언어에서 사용할 수 있습니다.C + + 코드에서 다음 ANSI C 표준 폼을 다른 형식에 대 한 포인터를 것 처럼에 대 한 포인터를 수정할 수 있습니다.
앞의 예제를 다음과 같이 ANSI C 표준에 맞게 다시 작성할 수 있습니다.
p = ( char * )(( int * )p + 1 );
함수 포인터를 데이터 포인터로 비 ANSI 캐스팅.예를 들면 다음과 같습니다.
int ( * pfunc ) (); int *pdata; pdata = ( int * ) pfunc;
동일한 캐스트를 수행 하며 또한 ANSI 규격을 유지 하는 함수 포인터로 캐스팅할 수는 uintptr_t 데이터 포인터로 캐스팅 하기 전에:
pdata = ( int * ) (uintptr_t) pfunc;
가변 길이 인수 목록
가변 형식 대신 제공 하는 함수 정의가 옵니다 인수를 지정 하는 함수 선언 자 컴파일러를 지원 합니다.
void myfunc( int x, ... );
void myfunc( int x, char * c )
{ }
한 줄로 된 주석
두 개의 슬래시를 사용 하 여 소개 하는 한 줄 주석은 C 컴파일러 지원 (/ /) 문자.
// This is a single-line comment.
범위
C 컴파일러는 다음과 같은 범위 관련 기능을 지원합니다.
extern 항목을 static으로 재정의
extern int clip(); static int clip() {}
같은 범위 내에서 typedef 재정의 사용
typedef int INT; typedef int INT;
파일 범위의 함수 선언자
void func1() { extern int func2( double ); } 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[5] = {'a', 'b', "cde"};
비트 필드 이외의 기본 형식 unsigned int 또는 signed int.
저장소 클래스나 형식 없는 선언 자:
x; int main( void ) { x = 1; }
구조체와 공용 구조체의 마지막 필드로 크기를 지정하지 않은 배열 사용
struct zero { char *c; int zarray[]; };
명명되지 않은(익명) 구조체
struct { int i; char *s; };
명명되지 않은(익명) 공용 구조체
union { int i; float fl; };
명명되지 않은 멤버
struct s { unsigned int flag : 1; unsigned int : 31; }
내장 부동 소수점 함수
/Oi를 지정한 경우 컴파일러는 atan, atan2, cos, exp, log, log10, sin, sqrt 및 tan 함수 END x86 Specific의 인라인 생성 **x86 Specific >**을 지원합니다.C의 경우, ANSI 규칙은 내장 함수가 errno 변수를 설정하지 않으므로 이러한 내장 함수가 사용될 때는 적용되지 않습니다.
비 Const 포인터 매개 변수를 Const 포인터 매개 변수 참조를 원하는 함수에 전달
이는 C++에 대한 확장입니다.이 코드를 컴파일합니다 /Ze.
typedef int T;
const T acT = 9; // A constant of type 'T'
const T* pcT = &acT; // A pointer to a constant of type 'T'
void func2 ( const T*& rpcT ) // A reference to a pointer to a constant of type 'T'
{
rpcT = pcT;
}
T* pT; // A pointer to a 'T'
void func ()
{
func2 ( pT ); // Should be an error, but isn't detected
*pT = 7; // Invalidly overwrites the constant 'acT'
}
ISO646.H를 사용할 수 없음
/Ze 옵션을 사용할 경우 텍스트 서식의 다음 연산자를 사용하려면 iso646.h를 포함해야 합니다.
&&(and)
&= (and_eq)
& (bitand)
| (bitor)
~ (compl)
!(not)
!= (not_eq)
|| (or)
|= (or_eq)
^ (xor)
^= (xor_eq)
문자열 리터럴 형식에 const char [, 않는 const char (*)]의 주소
다음 예제 코드는 /Za가 지정된 경우에는 char const (*)[4]를 출력하지만 /Ze가 지정된 경우에는 char const [4]를 출력합니다.
#include <stdio.h>
#include <typeinfo>
int main()
{
printf_s("%s\n", typeid(&"abc").name());
}