2010-07-04 2 views
7

Я хочу использовать функцию htonl в моем расширении ruby ​​c, но не хочу использовать какой-либо другой материал, который поставляется с ним. Какой был бы самый минималистический файл для #include, который по-прежнему переносится? Просматривая заголовочные файлы на моем компьютере, я вижу, что либо machine/endian.h, либо sys/_endian.h позволили бы мне использовать их, хотя я не уверен, что это хорошая идея.Что мне следует включить # для использования 'htonl'?

ответ

8

Заголовок standard является:

#include <arpa/inet.h> 

Вам не придется беспокоиться о других вещей, определенных в этом заголовке. Он не повлияет на ваш скомпилированный код и должен иметь лишь незначительный эффект на время компиляции.

EDIT: Вы можете проверить это. Создать два файла, htonl_manual.c

// non-portable, minimalistic header 
#include <byteswap.h> 
#include <stdio.h> 
int main() 
{ 
    int x = 1; 
    x = __bswap_32(x); 
    printf("%d\n", x); 
} 

и htonl_include.c:

// portable 
#include <arpa/inet.h> 
#include <stdio.h> 
int main() 
{ 
    int x = 1; 
    x = htonl(x); 
    printf("%d\n", x); 
} 

Соберите их в -O1, а затем взять разницу:

gcc htonl_manual.c -o htonl_manual.s -S -O1 
gcc htonl_include.c -o htonl_include.s -S -O1 
diff htonl_include.s htonl_manual.s 

Для меня, единственное различие это имя файла.

+0

Спасибо! Я не знал, что это не изменит скомпилированный код. Прежде чем вы ответили, я подумывал о написании своей собственной версии, чтобы мой код оставался небольшим. – Adrian

0

Если вы не хотите включать что-либо связанное с сетью, то это совершенно справедливо для объявления htonl. Просто #include <stdint.h> получить uint32_t и использовать следующий прототип:

uint32_t htonl(uint32_t);

Ссылка: POSIX: http://www.opengroup.org/onlinepubs/9699919799/functions/htonl.html

Вы также можете просто реализовать свой собственный по заказу тестирования байт (при compiletime) с помощью союзов. Это не требует каких-либо нечетных макросов ENDIAN или #ifdefs.

Смежные вопросы