Что должно я #include для использования 'htonl'?

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

14
задан Adrian 4 July 2010 в 03:36
поделиться

2 ответа

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

#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

Для меня разница только в имени файла.

13
ответ дан 1 December 2019 в 14:43
поделиться

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

uint32_t htonl(uint32_t);

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

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

-2
ответ дан 1 December 2019 в 14:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: