1. 형식 정의
형식 정의 이름은 타입 정의를 의미한다 제안하지만 새로운 유형을 정의하지 않지만,이 시점에서 기존의 유형 별칭에 유사한 의미를 인용, 참조는 변수 또는 객체의 별칭이며, 형식 정의는 별명의 유형에 의해 정의됩니다. 두 가지 주요 활동 형식 정의가 있습니다 :
1.1 단순화 복잡한 유형 선언
한 형태에서 명확한 기존 별명 복합 타입 선언을 단순화하거나, 예를 들면 :
불리언 타입 정의 (* FuncPointer) INT (더블) // 타입을 선언하고, 두 개의 리턴 불리언 (INT 더블) 함수 포인터 형 FuncPointer의 파라미터
FuncPointer pFunc는; // 함수 포인터 타입 FuncPointer이 pFunc 객체 선언
1.2 정의 플랫폼 독립 형식
플랫폼 독립적 인 유형의 정의, 서로 다른 플랫폼은 차이의 유형을 보호, 같은 :
종류와 플랫폼에 독립적를 정의하는 타입 정의를 사용합니다.
예를 들어, 대상 플랫폼에, REAL라는 부동 소수점 형의 정의, 그것은 가장 정확한 유형을 나타냅니다 :
긴 더블 REAL를 형식 정의를;
플랫폼이 긴 이중 두를 지원하지 않습니다에 읽기 :
이중 REAL를 형식 정의를;
트리플 더블을 지원하지 않는 플랫폼에서 읽을 수 있습니다 :
타입 정의 플로트 REAL;
즉, 때와 같은 라인에있는 크로스 플랫폼, 길이 변경 등의 다른 소스를 변경하지 않고, 자체 타입 정의 다음.
예를 size_t로이 기술의 광범위한 사용에 표준 라이브러리. 또한, 때문에 형식 정의는 매크로보다 안정적이고, 그래서이 아닌 단순한 문자열, 대체 별칭의 새로운 유형을 정의하는 것입니다.
1.3 구조체와 함께 사용
C ++에서 같은 효과 구조체와 클래스, 다른 기본 액세스, 대중에게 구조체의 기본값 및 개인에 클래스 기본값입니다.
[예 1.3.1]
구조체 사람
{
문자열 이름;
INT 나이;
높이 떠;
};
인 사람; </ SPAN>
유형 사람, Person 객체 사람의 정의의 구조체 정의.
또는
구조체 사람
{
문자열 이름;
INT 나이;
높이 떠;
}사람;
같은 시간에 정의 된 바와 같이 사람의 유형의 구조체 정의는 또한 대상자의 사람을 선언했다.
C 언어, 정의와 선언 구조체 형식 정의의 사용.
[예 1.3.2]
타입 정의 구조체 __Person
{
문자열 이름;
INT 나이;
높이 떠;
} 사람; //이 별명 사람의 구조
사람이 사람;
당신은 사람이 사람을 typedef 구조체에 사용하지 않는 경우, 같은 선언합니다 :
[예 1.3.3]
[CPP] 일반 뷰 복사
구조체 사람
{
문자열 이름;
INT 나이;
높이 떠;
};
사람이 사람을 구조체;
또는
구조체 사람
{
문자열 이름;
INT 나이;
높이 떠;
} 사람; // 사람 Person 객체입니다
2. 타입 정의 및 #DEFINE 차이
2.1. 다른 실행 시간
키워드 형식 정의 효과적인 컴파일시에,이 컴파일시에 있기 때문에, 그래서 형식 정의 기능 유형 검사.
#DEFINE 매크로가 어떤 검사를하지 않고, 컴파일하기 전에, 전처리 단계에서, 즉 발생하고 수행 단순한 문자열 여분의 시스템 정의된다.
[실시 예 2.1.1] 타입 정의는 해당 타입 검사를 수행한다 :
타입 정의 부호 INT UINT;
보이드 FUNC ()
{
UINT 값 = "ABC"; // 오류 C2440 : '초기화':에서 변환 할 수 없습니다 'const를 문자 [4]'에서 'UINT'
<< COUT 값 << ENDL;
}
[실시 예 2.1.2] #DEFINE 타입 체크를 수행
// # 예문을 정의합니다 :
#DEFINE의 F (x)는 X * X
() 주요 int로
{
A = 6, B = 2, C에서 INT;
C = F (a) / F (b);
의 printf ( "가 % d \ n", c);
0을 반환;
}
프로그램의 출력은 : 36 근본적인 이유는 단순히 #DEFINE 문자열 여분이다.
2.2. 기능적인 차이가 있습니다
타입 정의 데이터 타입의 별명, 플랫폼 독립 정의의 형태를 정의하기 위해 사용하고, 구조체와 함께 사용 등을들 수있다.
#DEFINE는 상수, 변수, 컴파일러 스위치를 정의 할뿐만 아니라, 별명의 유형을 취할 수있다.
2.3. 다른 범위
미리 정의 된 매크로 후속 절차에서 사용할 수 있습니다되기 이전만큼, 제한 범위를 #define한다 없습니다.
typedef입니다 자체 범위를 가지고있다.
[예 2.3.1] 제한 없음 범위는만큼 당신은 전에 너무 미리 정의 수
FUNC1 공극 ()
{
#DEFINE HW이 "Helloworld";
}
보이드 FUNC2 ()
{
문자열 STR은 HW를 =;
COUT << STR << ENDL;
}
[실시 예 2.3.2]과의 typedef 자체 범위를 갖는다
FUNC1 공극 ()
{
타입 정의 부호 INT UINT;
}
보이드 FUNC2 ()
{
UINT uValue = 5; // 오류 C2065 'UINT'선언되지 않은 식별자
}
[예 2.3.3]
A 급
{
타입 정의 부호 INT UINT;
UINT valueA;
A () : valueA (0) {}
};
클래스 B
{
UINT VALUE (단위 : 십억);
// 오류 C2146 : 구문 오류 : 실종 ';' 이전 식별자 'VALUE (단위 : 십억)'
// 오류 C4430 : 형식 지정자가 누락 - INT는 가정. 참고 : C ++는 기본적-INT를 지원하지 않습니다
};
위의 예에서 사용 된 UINT 에러 클래스 A. UINT의 범위에 있기 때문에, 클래스 B에서 발생 또한, 타입 정의 별명 클래스 타입은 또한 적절한 액세스 권한 [2.3.4] 실시 예를 가지고
A 급
{
타입 정의 부호 INT UINT;
UINT valueA;
A () : valueA (0) {}
};
보이드 func3 ()
{
i가 1 = A :: UINT;
// 오류 C2248은 : 'A는 :: UINT는'개인 타입 정의는 'A'클래스에서 선언에 액세스 할 수 없습니다
}
그리고 UINT는 공용 액세스를 추가 한 후, 당신은 컴파일 할 수 있습니다.
[예 2.3.5]
A 급
{
공공의:
타입 정의 부호 INT UINT;
UINT valueA;
A () : valueA (0) {}
};
보이드 func3 ()
{
i가 1 = A :: UINT;
COUT << I << ENDL;
}
2.4. 포인터의 동작
때 수정 된 포인터 타입, 다른 역할을 모두.
타입 정의 INT * PINT; #DEFINE PINT INT * INT I1 = 1. , I2는 = 2 ; CONST PINT 및 P1 = I1; // p는, 콘텐츠가 점 (P)을 변경할 수 변경할 수없는 쪽의 CONST * 등가 INT; CONST PINT 및 P2 = I2 ; // P * 또는 CONST INT; P가 변경 될 수 CONST INT * (P)에 대응하여, P 점의 내용을 변경할 수 PINT S1을 S2; // S1과 S2는 INT 형 포인터이다 PINT S3, S4; // 상당한 INT에 * S3, S4, 하나의 포인터. 보이드 TestPointer () { COUT << " P1 : " << << P1 " * P1 : " << ENDL; // P1 = I2; // 오류 C3892 : 'P1': CONST있는 변수에 당신이 할 수있는 할당되지 * P1 = 5 ; COUT << " P1 : " << P1 << " * P1 : " << * P1 << ENDL; COUT << " P2 : " << P2 << " * P2 : " << * P2 << ENDL; // * P2 = 10; // 오류 C3892 : 'P2'인 변수에 당신이 할 수있는 할당되지 const를 P2 = I1; " << P2 << " * P2 : " << * P2 << ENDL; } 结果: P1 : 00EFD094 * P1 : 1 (P1) : 00EFD094 * P1 : 5 P2 : 00EFD098 * P2 : 2 (P2) : 00EFD094 * P2 : 5