我应该#include使用'htonl'?

Adr*_*ian 14 c include endianness

我想htonl在我的ruby c扩展中使用该函数,但不想使用随附的任何其他互联网内容.什么是最简约的文件#include仍然可移植?浏览我计算机上的头文件,我可以看到machine/endian.h或者sys/_endian.h让我使用它们,虽然我不确定这是不是一个好主意.

Mat*_*hen 13

标准报头是:

#include <arpa/inet.h>
Run Code Online (Sandbox Code Playgroud)

您不必担心该标头中定义的其他内容.它不会影响您编译的代码,并且只会对编译时间产生轻微影响.

编辑:你可以测试一下.创建两个文件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);
}
Run Code Online (Sandbox Code Playgroud)

和htonl_include.c:

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

在-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
Run Code Online (Sandbox Code Playgroud)

对我来说,唯一的区别是文件名.


Jea*_*bre 6

在 Windows 上,arpa/inet.h不存在所以这个答案 不会做。其中包括:

#include <winsock.h>
Run Code Online (Sandbox Code Playgroud)

所以包含块的便携版本(总是最好提供一个):

#ifdef _WIN32
#include <winsock.h>
#else
#include <arpa/inet.h>
#endif
Run Code Online (Sandbox Code Playgroud)