Возможно ли каким-либо образом определить, предоставлена ли компилятором встроенная функция, такая как __builtin_bswap16
? Предпочтительно, я хотел бы иметь возможность определить, существует ли эта функция, используя только препроцессор.C/pre-processor: определить, доступна ли функция __builtin
В моем конкретном случае я использовал __builtin_bswap16
/32/64 функции в моем коде, который отлично работал с GCC 4.x при компиляции для 32-битного. Позже я перешел на 64-битном Linux и заметил, что __builtin_bswap16
внезапно исчез - я получил сообщение об ошибке компоновщика:
"undefined reference to `__builtin_bswap16'".
Я предполагаю, что это что-то делать с наличием определенных операций ASM в 64-битном режиме.
В более позднем случае я пытался скомпилировать этот код на другой машине, где, к сожалению, установлена только старая версия GCC и вообще не поддерживает эти функции.
Я хотел бы сделать этот компилируемый код повсеместно, используя __builtin_bswap
функции, если они предусмотрены, и вернуться к ручной кодировке byteswap
, если нет. Можно ли это как-то добиться с помощью препроцессора?
Моя очевидная попытка, например .:
...
#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
...
не был успешным, так как __builtin_bswap16
/32/64 всегда оценивается как неопределенная. Есть ли способ заставить его работать автоматически в источнике C или это единственный способ вручную определить константы в Makefile, например. HAVE_BSWAP
и передать их через -D
вариант?
Обратите внимание, что мой вопрос не обязательно относится к __builtin_bswap
. Я ищу общий способ определения наличия определенных функций.