gpt4 book ai didi

c++ - union 不能在类型说明符中定义

转载 作者:太空狗 更新时间:2023-10-29 20:19:38 26 4
gpt4 key购买 nike

我尝试在我的 C++ 应用程序中包含来自 Github 的 C 代码库,但遇到了一些编译错误。

原始代码的错误:

'_u16' cannot be defined in a type specifier


non-constant-expression cannot be narrowed from type 'int' to 'uint8_t' (aka 'unsigned char') in initializer list [-Wc++11-narrowing]

该应用程序由 Clang 10.0.1 在 macOS 上使用 CMake 编译,CMakeLists.txt 中包含以下内容:

set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c11")

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

原代码如下:

inline static void UInt16SetBE(void *b2, uint16_t u)
{
*(union _u16 { uint8_t u8[16/8]; } *)b2 = (union _u16) { (u >> 8) & 0xff, u & 0xff };
}

以下是我添加转换后尝试解决错误的代码:

inline static void UInt16SetBE(void *b2, uint16_t u)
{
*(union _u16 { uint8_t u8[16/8]; } *)b2 = (union _u16) { (uint8_t)((u >> 8) & 0xff), (uint8_t)(u & 0xff) };
}

更改后的错误:

'_u16' cannot be defined in a type specifier

有谁知道声明的语法是什么意思?*(union _u16 { uint8_t u8[16/8]; } *)b2

最佳答案

他们声明了一个 union 类型,_u16,它包含一个两个字节的数组,然后他们假装指针 b2 是指向该类型 union 的指针.然后,他们取 u 并取其高字节和低字节,并将它们分别分配给该数组的两个位置。这是一种设置大端 16 位值的相当困惑的方法。

您尝试修复编译错误的方向是正确的,但为了让它与 Clang 一起工作,我认为您需要先声明 union 类型,以便编译器在赋值的右侧识别它。

inline static void UInt16SetBE(void *b2, uint16_t u)
{
union _u16 { uint8_t u8[16/8]; };
*(union _u16 *)b2 = (union _u16) { (uint8_t)((u >> 8) & 0xff), (uint8_t)(u & 0xff) };
}

也就是说,该代码非常困惑,并且有更简单的方法可以做到这一点,例如:

inline static void UInt16SetBE(void *b2, uint16_t u)
{
((uint8_t *) b2)[0] = (uint8_t) (u >> 8) & 0xff;
((uint8_t *) b2)[1] = (uint8_t) u & 0xff;
}

关于c++ - union 不能在类型说明符中定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57679720/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com