我是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,而不是两个解决方案都使用同一编译器?为什么在一种解决方案中它没有错误地被编译而在一种错误中呢?
我应该如何修复具有相同的空结构。因为更改可能会影响其他部分。
答案 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
的各种可能扩展名,因此可能比它值得的麻烦更多。