未正确定义 Endianess 宏

Endianess macros not correctly defined

本文关键字:Endianess 定义      更新时间:2023-10-16

我正在尝试编译grpc,其中一个目标使用包含以下内容的/usr/include/netinet/tcp.h

# if __BYTE_ORDER == __LITTLE_ENDIAN
uint8_t th_x2:4;        /* (unused) */
uint8_t th_off:4;       /* data offset */
# endif
# if __BYTE_ORDER == __BIG_ENDIAN
uint8_t th_off:4;       /* data offset */
uint8_t th_x2:4;        /* (unused) */
# endif

不知何故,满足这两个条件,使编译失败(error: duplicate member 'th_off')。我写了一个测试 C 程序,似乎三个宏的定义不正确。

我尝试重新安装gccg++,并将它们降级到以前的版本。我还尝试重新安装 Linux 标头。我终于尝试用clang编译,但它也不起作用。

我的两台测试计算机运行的是 Ubuntu 19.10,它们的结果都是一样的。是否需要编译器标志或系统配置来定义这些宏?

编辑:tcp.h是一个系统标题。它不是我写的,它是 Ubuntu 的几乎全新安装,标准安装build-essentials.

编辑2:我使用了一个测试程序,在这种情况下它可以正常工作。它显示little

#include <iostream>
#include <netinet/tcp.h>
int main() {
#if __BYTE_ORDER == __LITTLE_ENDIAN
std::cout << "littlen";
#endif
#if __BYTE_ORDER == __BIG_ENDIAN
std::cout << "bign";
#endif
}

在我的 Debian 系统上,__LITTLE_ENDIAN__BIG_ENDIAN/usr/include/endian.h中定义。我相信这个文件旨在跨架构通用。

__BYTE_ORDER被定义为其中之一/usr/include/bits/endian.h.我认为bits目录包含特定于特定架构的标头。

tcp.h包括<types.h>,我认为应该间接包括这些并定义宏。我不知道为什么它没有发生在你身上。

您可以使用 gcc 内置:

# if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
uint8_t th_x2:4;        /* (unused) */
uint8_t th_off:4;       /* data offset */
# endif
# if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
uint8_t th_off:4;       /* data offset */
uint8_t th_x2:4;        /* (unused) */
# endif

在 c 预处理器中,两个不存在的宏相等。

来源: https://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html