未正确定义 Endianess 宏
Endianess macros not correctly defined
我正在尝试编译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 << "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
相关文章:
- 在提升multi_index容器中,是否定义了"default index"?
- #定义c-预处理器常量..我做错了什么
- 用C++中的一个变量定义一个常量
- 部分定义/别名模板模板参数
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- #为""定义宏;静态";针对不同的上下文
- 如何确保C++函数在定义之前声明(如override关键字)
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在命名空间中定义函数还是限定函数
- 此代码是否违反一个定义规则
- 编译C++时未定义的引用
- 不同翻译单元中不可重载的非内联函数定义
- 为什么在定义函数之前先声明它
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 在类定义之后定义一个私有方法
- 使用用户定义函数的字符串反转
- 用户定义函数中的指针和输入
- 未正确定义 Endianess 宏
- 实现现有的网络接口,以相对于C 11中的Endianess定义位字段