2014-11-25 1 views
2

는 : == I는 항등 연산자의 구현을 발견아무도 MSVC++ std 라이브러리에서이 배열 접근을 설명 할 수 있습니까? 일반적으로 C에 위치하고있는 type_info의 비주얼 스튜디오 구현에서

class type_info { 
    /* ... */ 

    _CRTIMP_PURE bool __CLR_OR_THIS_CALL operator==(const type_info& _Rhs) const; 

    /* ... */ 

private: 
    void *_M_data; 
    char _M_d_name[1]; 
    __CLR_OR_THIS_CALL type_info(const type_info& _Rhs); 

    /* ... */ 

}; 

: \ 프로그램 파일 마이크로 소프트 비주얼 스튜디오 10.0 \ VC \ \ (86)는 \ 소속 카테고리 포함 _M_d_name + 1 문자 포인터를 사용합니다. 아무도 내게 "작동"하는 방법을 설명 할 수 있기 때문에 그것이 배열 범위 밖에있을 것 같습니까?

구현, C : \ 프로그램 파일 (86) 마이크로 소프트 비주얼 스튜디오 \ 10.0 \ VC \의 CRT \ SRC \ ti_inst.cpp :

ASSERT_UNMANAGED_CODE_ATTRIBUTE 
SECURITYSAFECRITICAL_ATTRIBUTE 
bool type_info::operator==(const type_info& rhs) const 
{ 
     return (strcmp((rhs._M_d_name)+1, (_M_d_name)+1)?0:1); 
} 

감사합니다!

+1

이것은 기본적으로 가변 길이 구조체를 작성하는 방법입니다. –

+3

이것은 컴파일러 등을 포함하는 "구현"의 일부이기 때문에 정의되지 않은 동작을 사용하도록 정의하는 등 원하는대로 자유롭게 정의 할 수 있습니다. –

+0

@ T.C. 귀하의 의견에 감사드립니다. 네가 조금 더 정교하게 만들 수있는 기회가 있니? – trev

답변

1

이 트릭은 유연한 배열 구성원을위한 것입니다. class type_info과 이름 문자열에 메모리를 할당하므로 (rhs._M_d_name)+1은 정확히 이름 문자열이있는 위치입니다. 여기를 설명하는 차트입니다

 +------------+ --+   
     |   | |   
     +------------+    
     |   | |   
     |   | ->type_info 
     +------------+ |   
+-------+ _M_d_name | |   
|  +------------+ --+   
+------->   |    
     |   |    
     |   |    
     +------------+    

사실, C99은이 기능을 지원하고 a Microsoft extension allows the last member of a C or C++ structure or class to be a variable-sized array

관련 문제