Что я должен #include использовать 'htonl'? - PullRequest
13 голосов
/ 04 июля 2010

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

Ответы [ 2 ]

13 голосов
/ 04 июля 2010

Стандартный заголовок :

#include <arpa/inet.h>

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

РЕДАКТИРОВАТЬ: Вы можете проверить это. Создайте два файла, 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 голосов
/ 04 июля 2010

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

uint32_t htonl(uint32_t);

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

Вы также можете просто реализовать свой собственный, протестировав порядок байтов (во время компиляции), используя объединения. Для этого не требуется никаких нечетных макросов ENDIAN или # ifdefs.

...