VC의 경우, 전방 선언 및 기본 유형 지정에 대한 테스트가 있습니다.
- 다음 코드는 정상적으로 컴파일됩니다.
typedef int myint;
열거 형 T;
무효 foo (T * tp)
{
* tp = (T) 0x12345678;
}
열거 형 T : char
{
ㅏ
};
그러나 / W4에 대한 경고를 받았습니다 (/ W3은이 경고를 발생시키지 않습니다)
경고 C4480 : 비표준 확장 사용 : 열거 형 'T'에 대한 기본 유형 지정
VC (80x86 용 Microsoft 32 비트 C / C ++ 최적화 컴파일러 버전 15.00.30729.01)는 위의 경우 버그로 보입니다.
- 열거 형 T를 볼 때; VC는 열거 형 T가 기본 유형으로 기본 4 바이트 int를 사용한다고 가정하므로 생성 된 어셈블리 코드는 다음과 같습니다.
? foo @@ YAXPAW4T @@@ Z PROC; 푸
; 파일 e : \ work \ c_cpp \ cpp_snippet.cpp
; 13 호선
푸시 ebp
mov ebp, esp
; 14 호선
mov eax, DWORD PTR _tp $ [ebp]
mov DWORD PTR [eax], 305419896; 12345678H
; 15 호선
팝 ebp
리트 0
? foo @@ YAXPAW4T @@@ Z ENDP; 푸
위의 어셈블리 코드는 개인적 추측이 아닌 /Fatest.asm에서 직접 추출됩니다. mov DWORD PTR [eax], 305419896; 12345678H 라인?
다음 코드 스 니펫이이를 증명합니다.
int main (int argc, char * argv)
{
노동 조합 {
숯 ca [4];
T t;
}ㅏ;
a.ca [0] = a.ca [1] = a. [ca [2] = a.ca [3] = 1;
foo (& a.t);
printf ( "% # x, % # x, % # x, % # x \ n", a.ca [0], a.ca [1], a.ca [2], a.ca [3]) ;
리턴 0;
}
결과 : 0x78, 0x56, 0x34, 0x12
- enum T의 정방향 선언을 제거하고 enum T의 정의 다음에 함수 foo의 정의를 이동 한 후 결과는 정상입니다.
위의 키 명령은 다음과 같습니다.
mov BYTE PTR [eax], 120; 00000078H
최종 결과는 0x78, 0x1, 0x1, 0x1입니다.
값을 덮어 쓰지 않습니다.
따라서 VC에서 enum의 선언을 사용하는 것은 해로운 것으로 간주됩니다.
BTW, 놀랍지 않게, 기본 유형의 선언 구문은 C #의 구문과 동일합니다. 실제로는 임베디드 시스템과 통신 할 때 기본 유형을 char로 지정하여 메모리를 제한하는 3 바이트를 절약 할 가치가 있음을 알았습니다.