2010-12-01 8 views
8

gcc 내장 함수를 사용하는 코드가 있습니다. intrinsic이없는 경우 코드를 포함하고 싶습니다. 어떻게해야합니까?내장 함수/내장 함수 테스트

#ifdef __builtin_ctzll 

이 작동하지 않습니다.

답변

4

최근 버전의 clang에서는 __has_builtin() 매크로를 사용하여 내장 내장 함수가 있는지 확인할 수 있습니다.

int popcount(int x) 
{ 
#if __has_builtin(__builtin_popcount) 
    return __builtin_popcount(x); 
#else 
    int count = 0; 
    for (; x != 0; x &= x - 1) 
    count++; 
    return count; 
#endif 
} 

하자 희망 GCC는 또한 미래에 __has_builtin() 지원합니다.

+0

이것이 사실 일 수 있다는 어떤 징후가 있습니까? 당분간 당신의 솔루션은 gcc가 내장 된 것을 사용하지 못하도록 차단합니다. 나는이 기능이 gcc에서 소개 된 후에도 적어도 5 년 동안은 여전히 ​​지원하지 않는 버전을 볼 것이라고 생각합니다. 일부 배포판은 새로운 버전을 적용하는 데 아주 느립니다. –

+0

__has_builtin() 매크로는 2012 년 1 월 GCC 메일 링리스트의 일부 스레드에서 언급되었으며이 스레드 http://comments.gmane.org/gmane.comp.gcc.help/42610도 유망합니다. 하지만 GCC 4.8에는 너무 늦어서 다른 해를 기다려야 할 것입니다. – Linoliumz

2

__builtin_ctzll매크로 이름으로 정의되어 있는지 여부를 #ifdef 지시어 검사, 그것은 __builtin_ctzll기능이 존재하는지 여부를 판단하는 데 도움이되지 않습니다.

필자는 gcc 내장 함수에 익숙하지 않아 이보다 더 많은 것을 지원하지 못합니다. 어떻게 내장 함수가 누락 될 수 있습니까?

+0

예를 들어 특정 아키텍처에서는 지원되지 않습니다. – Charles

3

gcc 버전을 테스트하고 이것이 모든 아키텍처에서 일관되게 이루어 지길 바랄뿐입니다.

비록 이것이 최근에 내장 함수가 아닌 스레드 로컬 저장을위한 __thread과 비슷한 문제를 안고 있습니다. 이것은 일부 아키텍쳐 (리눅스)에서 구현되었지만 다른 것들 (OS X, bsd?)에서는 구현되지 않았으며 매크로로 이것을 발견 할 방법이 없었습니다.

당신이 GNU이있는 경우

은 Makefile의 특정 기능의 존재를 감지하는 비슷한 뭔가를 할 수 있도록 :

__THREAD := $(shell echo '__thread int i;' | ${CC} ${CFLAGS} -xc -c -o /dev/null - 2> /dev/null || echo "NO") 
ifeq (${__THREAD},NO) 
${warning thread local storage (TLS) with '__thread' is not supported, switching to pthread_getkey} 
CFLAGS += -D__GNUC_NO_TLS__ 
endif 

이 더 복잡한 구성 유틸리티를 사용하여 방지 할 수 있습니다.

관련 문제