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

C++ 错误:C2016 ;C要求结构或联合至少有一个成员,c++,c,visual-c++,struct,C++,C,Visual C++,Struct,我是c/c++的新手,在c++中使用一些c项目标题时遇到了一个问题 我有两个解决方案,一个包含大部分c文件(也有少数cpp),另一个只包含两个cpp文件。每个解决方案都得到编译并正确运行,没有错误。 两者都在VisualStudiov.15.9.4 VC++2017上targetingwindows SDK 10.0.17134.0 我确实从#1到#2复制粘贴了一些头文件,并在编译时在标题中得到了错误 typedef struct { U32 RESERVED; SHARED_T

我是c/c++的新手,在
c++
中使用一些
c
项目标题时遇到了一个问题

我有两个解决方案,一个包含大部分
c
文件(也有少数
cpp
),另一个只包含两个
cpp
文件。每个解决方案都得到编译并正确运行,没有错误。 两者都在VisualStudio
v.15.9.4 VC++2017上
targeting
windows SDK 10.0.17134.0

我确实从#1到#2复制粘贴了一些头文件,并在编译时在标题中得到了错误

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
typedef结构
{
U32保留;
共享类型*共享;
结构
{

当错误消息有助于指出的时候,标准C不允许空结构,标准C++允许它们,因为它们可以作为模板元和超负荷分辨率,以及其他用途。 从错误消息中,您似乎正在使用Visual Studio C编译器编译该头

其他编译器则更为宽松。空C结构是一个长期存在的GCC扩展,并且经常被用作所谓的另一种形式,如本例所示。在其经典形式中,结构破解包括放置长度为1的数组(或者,使用GCC,长度为0)作为可变长度扩展的一种占位符。在这种情况下,可变长度扩展可能是一个未指定类型的单个对象,而不是传统的struct hack,它是一个指定类型但未指定长度的对象数组

所以GCC(和Clang)接受
struct
声明为有效的C,除非您请求使用
-pedantic
进行严格验证(即使如此,它也会显示为警告,而不是错误)


一般来说,<代码>联合<代码>将是一个更好的解决方案。但是这需要知道对代码的各种可能的扩展> TxRequest < /C> >,所以它可能比它的价值更麻烦。

< P>不允许空结构,正如错误消息所指出的。标准C++允许它们,因为它们可以作为T。放置元值并用于重载解析,以及其他目的

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

其他编译器则更为宽松。空C结构是一个长期存在的GCC扩展,并且经常被用作所谓的另一种形式,如本例所示。在其经典形式中,结构破解包括放置长度为1的数组(或者,使用GCC,长度为0)作为可变长度扩展的一种占位符。在这种情况下,可变长度扩展可能是一个未指定类型的单个对象,而不是传统的struct hack,它是一个指定类型但未指定长度的对象数组

所以GCC(和Clang)接受
struct
声明为有效的C,除非您请求使用
-pedantic
进行严格验证(即使如此,它也会显示为警告,而不是错误)


一般来说,<代码>联合/代码>将是一个更好的解决方案。但是这需要知道对代码的各种可能的扩展> TxRequest < /COD>,因此它可能比它的价值更麻烦。< /P>空结构的目的是什么?C++支持空结构,但我真的很想知道什么是用例。@ JabbWoCKEY:抛出异常。NANOLIVER还不知道,它是协议栈的一部分,有数百个文件和C++是不同的语言。它们共享一个公共子集,但每个都有一个不兼容的另一个。假设你可以拾取任意的C++代码并编译成C,反之亦然,这是绝对不安全的。使用的编译器在某种意义上与此几乎没有关系。空结构C++的目的是支持空结构,但我真的很想知道什么是用例。@ JabBrWOKKY:抛出一个例外类型是一个用例。@ Nahanover还不知道,它是协议栈的一部分,有几百个文件和C++是不同的L。它们共享一个公共子集,但它们也有一个不兼容的地方。假设你可以拾取任意的C++代码并编译成C,反之亦然,这是绝对不安全的。使用的编译器在某种意义上与它没有什么关系。我仍然没有得到,VisualStudio如何以及为什么用两个DIF编译它们。Frand编译器?有没有办法用同一个编译器强制VS编译两个解决方案?@阿米尔:我相信一个编译成C,另一个编译成C++。这并不取决于头。文件中使用的语言包括头。我仍然没有得到,VisualStudio如何以及为什么用两个不同的方式编译它们。编译器?有没有办法用相同的编译器强制VS编译两个解决方案?@阿米尔:我相信一个编译为C,另一个编译为C++。这不取决于头。重要的是文件中包含的头文件中使用的语言。