Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 不能在类型说明符中定义联合_C++_C++11 - Fatal编程技术网

C++ 不能在类型说明符中定义联合

C++ 不能在类型说明符中定义联合,c++,c++11,C++,C++11,我尝试在我的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] inline static void

我尝试在我的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]
inline static void UInt16SetBE(void *b2, uint16_t u)
{
    *(union _u16 { uint8_t u8[16/8]; } *)b2 = (union _u16) { (u >> 8) & 0xff, u & 0xff };
}
该应用程序由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")
以下是原始代码:

'_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]
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{uint8_t u8[16/8];}*)b2
它们声明一个union类型,
\u u16
,它包含一个两个字节的数组,然后它们假装指针
b2
是指向该类型的union的指针。然后,它们取
u
并取其上下字节,并将它们分别分配到该数组的两个位置。这是一种相当混乱的设置大端16位值的方法

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

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 _u16 { uint8_t u8[16/8]; } *)b2
使用标记
\u u16
定义联合,将
b2
强制转换为指向新定义的联合类型的指针,然后取消对该指针的引用。但是,在C++中,试图以这种方式在CAST中定义类或联合类型是无效语法。我们可以通过向前移动定义来解决此问题:

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

那是演员阵容。一个非常糟糕的cast。可能会添加一些更糟糕的代码。如果这是开发人员的原始目标,那么这段代码几乎不能再多了。最好按照预期使用C编译器编译您找到的库,并将其用作库。C和C++是不同的语言,而在一个工作中,在另一种语言中工作的方式可能不一样。特别是在操作这样的字节时,@弗兰Cou.OISANDURIX给出的函数是“代码>内联”,它有一个很好的机会被定义在标题中,所以OP将不能单独编译并链接到C++翻译单元。也就是说,这个库不是已经有效的C++意味着作者没有努力使它成为有效的C++,所以我同意它也不能以其他方式工作,并且应该在C++程序中被理想地避免。@弗兰CouoOsand是一个关于内联类型声明的混淆。但是这个功能肯定需要更换。我总是谨慎的说“这相当于这个简单的东西”在C++中,因为有这么多的原因,为什么两个东西应该是平等的并不总是平等的,但我不认为任何奇怪的角落的原始语法的情况下,将是任何希望的方式…