错误:C2016 C要求结构或联合至少具有一个成员

时间:2019-01-08 16:48:16

标签: c++ c visual-c++ struct

我是c / c ++的新手,在c中使用某些c++项目标头遇到了问题。

我有两个解决方案,其中#one主要包含c个文件(也很少cpp个文件)和#两个仅cpp个文件。每个解决方案都会被编译并正确运行,没有错误。 两者都位于针对v.15.9.4 VC++ 2017的VisualStudio windows SDK 10.0.17134.0上。

我确实将一些头文件从#one复制粘贴到#two,并在编译时得到标题错误。

typedef struct
{
    U32 RESERVED;
    SHARED_TYPE *  SHARED;
    struct
    {
    } ALIEN; <--- HERE
} TxRequest;

Error   C2016   C requires that a struct or union has at least one member 
Error (active)  E0169   expected a declaration

搜索答案主要是关于编译器的区别,但是 定位于同一SDK,而不是两个解决方案都使用同一编译器?为什么在一种解决方案中它没有错误地被编译而在一种错误中呢?

我应该如何修复具有相同的空结构。因为更改可能会影响其他部分。

1 个答案:

答案 0 :(得分:4)

标准C不允许使用空结构,因为错误消息很有帮助地指出。标准C ++确实允许使用它们,因为它们可以用作模板元值和用于重载解析等用途。

从错误消息看来,您似乎正在使用Visual Studio C编译器编译该标头。

其他编译器更宽松。空C结构是GCC的长期扩展,在本示例中,空C结构经常被用作所谓的"struct hack"的另一种形式。在其经典形式中,struct hack包括将长度为1(或使用gcc,长度为0)的数组作为一种可变长度扩展名的占位符。在这种情况下,可变长度扩展名可能是未指定类型的单个对象,这与经典的struct hack相对,后者是指定类型但未指定长度的对象的数组。

因此,除非您要求使用struct进行严格验证(即使这样,它还是作为警告,而不是错误),否则GCC(和Clang)都将-pedantic声明视为有效的C。 >

一般而言,union是一个更好的解决方案。但这需要了解TxRequest的各种可能扩展名,因此可能比它值得的麻烦更多。