해당 형식 정의 및 사용과의 차이를 정의

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

 

추천

출처www.cnblogs.com/zhangjixiao/p/12005725.html