Тестирование на встроенные / встроенные - PullRequest
9 голосов
/ 01 декабря 2010

У меня есть некоторый код, который использует встроенные функции gcc. Я хотел бы включить код на случай, если внутреннее отсутствует. Как я могу это сделать?

#ifdef __builtin_ctzll

не работает.

Ответы [ 3 ]

5 голосов
/ 29 января 2013

В последних версиях 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() в будущем.

3 голосов
/ 01 декабря 2010

Единственное, что должно работать из коробки - это протестировать версию gcc и надеяться, что это последовательно делается на всех архитектурах.

Это не гарантируется, хотя у меня недавно была похожая проблема не со встроенными функциями, а с __thread для локального хранилища потоков. Это реализовано на некоторых архитектурах (linux), но не на других (OS X, bsd?), И не было способа выяснить это с помощью макроса.

Если у вас есть gnu make, вы можете сделать что-то подобное, чтобы обнаружить существование определенной функции в вашем 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

Это позволяет избежать использования более сложных конфигурационных утилит.

2 голосов
/ 01 декабря 2010

Директива #ifdef проверяет, определено ли __builtin_ctzll как имя макроса , это не поможет вам определить, существует ли функция __builtin_ctzll .

Я недостаточно знаком со встроенными командами gcc, чтобы помочь вам больше: как может отсутствовать внутреннее?

...