Я хочу использовать htonl
функция в моем рубине c расширение, но не хотят использовать любой другой интернет-материал, который идет с ним. К чему был бы самый минималистический файл #include
это все еще портативно? Просматривая заголовочные файлы на моем компьютере, я вижу это также machine/endian.h
или sys/_endian.h
позволил бы мне использовать их, хотя я не уверен, является ли это хорошей идеей.
Стандартныйзаголовок:
#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
Для меня разница только в имени файла.
Если вы не хотите включать ничего связанного с сетью, то вполне допустимо объявить htonl
самостоятельно. Просто #include
, чтобы получить uint32_t
и использовать следующий прототип:
uint32_t htonl(uint32_t);
Ссылка: POSIX: http://www.opengroup.org/onlinepubs/9699919799/functions/htonl.html
Вы также можете просто реализовать свой собственный, проверяя порядок байтов (в compiletime) с помощью союзов. Это не требует никаких странных макросов ENDIAN или #ifdef.