C++ 定义不带大小或零大小的数组

C++ 定义不带大小或零大小的数组,c++,c++11,C++,C++11,我偶然发现了下面的代码,这让我很困惑: union { struct { uint32_t Id; uint8_t a_data[]; }vendor; uint8_t avp[0]; }data; 这在g++7.2.1中编译得很好,但我不明白为什么。如何在定义a_数据时不需要提供大小>这是A,技术上不是C++的一部分(它是一个C唯一的特征)。 一些编译器(特别是GCC)很乐意将C的特性添加到C++中。因此,它是不可移植的,您应该

我偶然发现了下面的代码,这让我很困惑:

union
{
    struct
    {
        uint32_t Id;
        uint8_t a_data[];
    }vendor;
    uint8_t avp[0];
}data;
这在g++7.2.1中编译得很好,但我不明白为什么。如何在定义a_数据时不需要提供大小

>这是A,技术上不是C++的一部分(它是一个C唯一的特征)。
<>一些编译器(特别是GCC)很乐意将C的特性添加到C++中。因此,它是不可移植的,您应该尽可能避免使用此类代码。

这是因为GCC是C编译器,这是ISO C99的特性。。。G++是保留GCC特性的C++编译器。我想知道他们在处理这个问题时是如何处理严格的别名的。至少有三个大型平台使用了这个扩展,WIndows API就是用它编写的,我发现我的同事们在他们从WIndows到Linux的代码中移植了这个扩展。因为他们认为这是标准的。但Windows API也使用具有多个入口点的函数编写。这是初始化结构对象的一种可怕的方法,但很高兴知道@Swift FridayPie我使用术语“GCC”作为“GNU编译器集合”的缩写(这是它的官方用法)。不管怎样,<代码> GCC < /C>和<代码> G++< /C>程序都可以编译C和C++源文件。前端程序
gcc
g++
之间的区别在于它传递给实际编译器和链接器的一些标志。@Frederik.L libjpeg曾因使用此功能而存在漏洞。用这种方式描述文件格式很容易,文件的开头有固定的标题。问题是如何管理内存访问。<代码> AyDATA[]/Cuth>是C99标准,而不是由C++编译器普遍支持的,使用<代码> UTI8T T AVP(0);<代码>因为灵活成员是专用于相同目的的GCC扩展,所以根本不应该使用它。它可以追溯到1969年。其他一些编译器可能会将其视为大小为零的数组,任何访问都是越界的。