2008-11-11 1 views
28

필자는 템플릿 화 된 저수준 직렬화 코드를 가지고 있으며 컴파일시 시스템의 엔디안을 알아야합니다 (템플릿은 시스템의 엔디 언을 기반으로하므로).컴퓨터의 엔디안을 결정하기 위해 C++ 스타일의 컴파일 타임 어서션을 수행하는 방법이 있습니까?

지금은 몇 가지 플랫폼 정의가있는 헤더가 있지만 다소 템플릿 기반 테스트 (예 : static_assert 또는 boost_if)를 사용하여 endianness에 대한 주장을하는 것이 좋습니다. 내 코드가되는 이유는 컴파일해야 할 필요가 있고, 다양한 전문 공급 업체와 다양한 머신에서 실행되어야하며, 아마도 2008 년에는 존재하지 않는 디바이스 일 것입니다. 그래서 그 헤더 연도에 들어가야 할 것이 무엇인지 추측 할 수 없습니다 도로 아래로. 그리고 코드 기반의 수명은 약 10 년입니다. 따라서 나는 그 코드를 결코 따라갈 수 없다.

내 상황이 명확하게 이루어지기를 바랍니다.

그렇다면 공급 업체별 정의에 의존하지 않고도 엔디안을 결정할 수있는 컴파일 타임 테스트를 아는 사람이 있습니까?

답변

18

, 당신은 당신이 뭔가를 시도 할 수,

를 교대합니다 (WORDS_BIGENDIAN는 기본적으로 정의 설정) 일을 공정하게 보장되는의 AC_C_BIGENDIAN 매크로를 사용할 수있는 다음 (autoconf를에서 촬영) (GCC, 적어도 다른 브랜치를 제거함)

int is_big_endian() 
{ 
    union { 
     long int l; 
     char c[sizeof (long int)]; 
    } u; 

    u.l = 1; 

    if (u.c[sizeof(long int)-1] == 1) 
    { 
     return 1; 
    } 
    else 
     return 0; 
} 
+2

고마워, 그건 좋은 속임수 야. 그리고 저는 약간의 리엔지니어링으로 그것을 적용 할 수 있다고 생각합니다. 아직 확실하지는 않지만 좋은 리드. –

5

흠, 흥미로운 질문입니다. 내 생각 엔 이것이 불가능하다는거야. 매크로를 계속 사용하고 BOOST_STATIC_ASSERT(!BIG_ENDIAN); 또는 static_assert을 C++ 0x로 사용하십시오. 이유는 내가 endian'nes 속성 때문에 귀하의 실행 환경이 있다고 생각합니다. 그러나 static_assert는 컴파일시 고려됩니다.

GNU 골드 ELF 링커 코드를 살펴 보시기 바랍니다. 저자 인 Ian Lance Taylor는 템플릿을 사용하여 런타임시 최적의 성능을 보장하기 위해 컴파일시 오른쪽 엔디안을 선택했습니다. 그는 모든 가능한 엔디안을 명시 적으로 인스턴스화하므로 템플리트 정의 및 선언에 대해 별도의 컴파일 (헤더의 모든 템플리트가 아님)을 갖습니다. 그의 코드는 우수합니다.

+0

예 저는 스스로 해결할 수 없었습니다. . 그러나 나는 다른 상황을 위해 전에 불가능했던 것을 보았습니다 ... 아마 어쩌면, 아마도 누군가 여기에 좋은 아이디어를 내놓을지도 모릅니다.) –

+0

왜 이것이 작동하지 않을까요? #define IS_LITTLE_ENDIAN char (0x00ff)'. 이 솔루션은 @ MichaelBurr의 대답에서 영감을 얻은 것입니다. 템플릿과도 잘 작동합니다. [demo] (http://ideone.com/JAS7mO). 'char' 대신'uint8_t'를 사용한다고 가정하십시오. – iammilind

+1

@iam 나는 C 또는 C++에서 비트 패턴을 구성 할 수 있다고 생각하지 않습니다. 값 255를 생성 한 다음이를 char로 캐스팅합니다. C가 비트 표현을 지정하도록 허용했다하더라도 컴파일러가 메모리의 내용으로 비트 패턴을 해석하고 즉시 값으로 사용하지 않고 레지스터에로드하도록 유도해야합니다. 잘라내 기와 제로 확장과 같은 레지스터 독점의 경우 엔디안은 IIRC와 관련이 없습니다. –

18

컴파일 타임에이 작업을 수행하는 휴대용 방법이 없으므로 가장 좋은 방법은 Boostendian macros을 사용하거나 사용하는 방법을 에뮬레이트하는 것입니다. 당신의 autoconf를 사용하는 경우

+0

헤더 링크를 가져 주셔서 감사합니다. 좋은 참고 자료입니다. 그리고 내가 가지고있는 것과 비슷합니다. –

관련 문제