gcc 내장 함수를 사용하는 코드가 있습니다. intrinsic이없는 경우 코드를 포함하고 싶습니다. 어떻게해야합니까?내장 함수/내장 함수 테스트
#ifdef __builtin_ctzll
이 작동하지 않습니다.
gcc 내장 함수를 사용하는 코드가 있습니다. intrinsic이없는 경우 코드를 포함하고 싶습니다. 어떻게해야합니까?내장 함수/내장 함수 테스트
#ifdef __builtin_ctzll
이 작동하지 않습니다.
최근 버전의 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()
지원합니다.
__builtin_ctzll
는 매크로 이름으로 정의되어 있는지 여부를 #ifdef
지시어 검사, 그것은 __builtin_ctzll
기능이 존재하는지 여부를 판단하는 데 도움이되지 않습니다.
필자는 gcc 내장 함수에 익숙하지 않아 이보다 더 많은 것을 지원하지 못합니다. 어떻게 내장 함수가 누락 될 수 있습니까?
예를 들어 특정 아키텍처에서는 지원되지 않습니다. – Charles
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
이 더 복잡한 구성 유틸리티를 사용하여 방지 할 수 있습니다.
이것이 사실 일 수 있다는 어떤 징후가 있습니까? 당분간 당신의 솔루션은 gcc가 내장 된 것을 사용하지 못하도록 차단합니다. 나는이 기능이 gcc에서 소개 된 후에도 적어도 5 년 동안은 여전히 지원하지 않는 버전을 볼 것이라고 생각합니다. 일부 배포판은 새로운 버전을 적용하는 데 아주 느립니다. –
__has_builtin() 매크로는 2012 년 1 월 GCC 메일 링리스트의 일부 스레드에서 언급되었으며이 스레드 http://comments.gmane.org/gmane.comp.gcc.help/42610도 유망합니다. 하지만 GCC 4.8에는 너무 늦어서 다른 해를 기다려야 할 것입니다. – Linoliumz