Как проверить, доступна ли функция __builtin_ на gcc - PullRequest
0 голосов
/ 07 января 2019

Мне нужно знать, есть ли способ для gcc проверить наличие этих удивительных __builtin_MY_DESIRED_FUNCTIONs

Например, я хотел бы использовать __builtin_nan и быть уверенным, что он доступен для моей программы и не выйдет из строя во время компиляции.

Я буду более конкретным: на clang есть __has_builtin "checker", поэтому мы можем написать что-то вроде

#if __has_builtin(__builtin_nan)

Но я не могу найти аналог для gcc.

И, вероятно, я могу положиться только на gcc, например: «О, я сейчас на gcc, давайте предположим, что все эти __builtin_ здесь, как в примере ниже ...»

#if __GNUC__
double mynan = __builtin_nan("0");
#endif

И, вероятно, это будет работать, пока кто-нибудь не установит этот флаг компиляции "-fno-builtin".

1 Ответ

0 голосов
/ 07 января 2019

Нет, вам придется использовать __GNUC__ и __GNUC_MINOR____GNUC_PATCHLEVEL__, если вы используете такие версии gcc) для тестирования каждой встроенной функции, специфичной для каждого выпуска (выпуски gcc можно найти здесь )

Например:

/* __builtin_mul_overflow_p added in gcc 7.4 */
#if (__GNUC__ > 7) || \
         ((__GNUC__ == 7) && (__GNUC_MINOR__ > 3))
#define BUILTIN_MUL_OVERFLOW_EXIST
#endif

#ifdef BUILTIN_MUL_OVERFLOW_EXIST
int c = __builtin_mul_overflow_p (3, 2, 3) ? 0 : 3 * 2;
#endif

И есть открытая ошибка именно для того, о чем вы спрашиваете, в здесь .

...