2013-08-13 2 views
3

Возможно ли каким-либо образом определить, предоставлена ​​ли компилятором встроенная функция, такая как __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. Я ищу общий способ определения наличия определенных функций.

ответ

1

Sincw он отсутствует в некоторых версиях GCC, вы всегда можете добавить его в свой код самостоятельно:

static inline unsigned short __builtin_bswap16(unsigned short a) 
{ 
    return (a<<8)|(a>>8); 
} 
Смежные вопросы