2013-08-13 2 views
3

__builtin_bswap16과 같은 내장 함수가 컴파일러에서 제공되는지 여부를 어떻게 판단 할 수 있습니까? 이 함수가 선행 처리기를 사용하여 존재하는지 여부를 확인할 수 있습니다.C/전처리 기 : __builtin 함수를 사용할 수 있는지 확인하십시오.

필자의 특별한 경우, 32- 비트 용으로 컴파일 할 때 GCC 4.x에서 잘 작동하는 내 코드에 __builtin_bswap16/32/64 기능을 사용하고있었습니다. 나중에 나는 64 비트 리눅스로 전환하고 __builtin_bswap16이 갑자기 사라진 것을 발견 - 나는 링커 오류 접수 :

"undefined reference to `__builtin_bswap16'".

I이 64 비트 모드에서 특정 ASM 운영의 가용성을 함께 할 수있는 뭔가가 생각합니다.

나중에이 코드를 불행히도 GCC의 이전 버전 만 설치되어 있고이 기능을 전혀 지원하지 않는 다른 컴퓨터에서이 코드를 컴파일하려고했습니다.

이 코드는 어디서나 컴파일 할 수 있으며, 제공된 경우 __builtin_bswap 함수를 사용하고 손으로 코드화 된 byteswap 루틴으로 변환합니다. 그냥 전 처리기로 어떻게 든 이걸 달성 할 수 있습니까?/64분의 32 __builtin_bswap16 항상 undefined로 평가로

내 명백한 시도, 예컨대 :

... 
#define MYBSWAP16(v) (v>>8)|(v<<8) 
#ifdef __builtin_bswap16 
printf("bswap16 is defined : %04x\n", __builtin_bswap16(0x1234)); 
#else 
printf("bswap16 is not defined : %04x\n", MYBSWAP16(0x1234)); 
#endif 
... 

는 실패했습니다. C 소스 내에서 자동으로 작동하도록하는 방법이 있습니까, 아니면 Makefile에 수동으로 상수를 정의하는 유일한 방법입니다. HAVE_BSWAP을 입력하고 -D 옵션을 통해 전달 하시겠습니까?

제 질문은 반드시 __builtin_bswap과 관련이 없으므로 특정 기능을 사용할 수 있는지 감지하는 일반적인 방법을 찾고 있습니다.

답변

1

는 GCC의 일부 버전에서 누락 Sincw 당신은 항상 당신의 코드에 자신을 추가 할 수 있습니다 :

static inline unsigned short __builtin_bswap16(unsigned short a) 
{ 
    return (a<<8)|(a>>8); 
} 
관련 문제