【发布时间】:2020-02-19 20:52:35
【问题描述】:
我正在尝试编译 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程序,好像三个宏定义不正确。
我尝试重新安装gcc 和g++,并将它们降级到以前的版本。我还尝试重新安装 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 << "little\n";
#endif
#if __BYTE_ORDER == __BIG_ENDIAN
std::cout << "big\n";
#endif
}
【问题讨论】:
-
__LITTLE_ENDIAN和__BIG_ENDIAN是两个不同的常量,所以它们不能相等。在源代码的某个地方,它们已被重新定义。 -
@stark 他说它们根本没有定义,所以预处理器将它们全部视为
0。 -
如果你
printf("BE: %d\nLE: %d\nBO: %d\n", __BIG_ENDIAN, __LITTLE_ENDIAN, __BYTE_ORDER)你会得到什么 -
@stark 我看到它们在
/usr/include/endian.h中定义。bits/endian.h只是将__BYTE_ORDER定义为其中之一。 -
我在我的问题中添加了测试程序结果