C++ 为什么对象的大小为零

C++ 为什么对象的大小为零,c++,compiler-construction,size,C++,Compiler Construction,Size,我得到物体的大小为零,这是不应该的。请给我解释一下这个概念,为什么编译器会给出这个答案 #include<iostream> using namespace std; class xxx{ public: int a[]; // Why this line is not giving error. }; int main(int argc, char *argv[]) { xxx x1; cout<<si

我得到物体的大小为零,这是不应该的。请给我解释一下这个概念,为什么编译器会给出这个答案

  #include<iostream>
  using namespace std;

  class xxx{
      public: int a[];  // Why this line is not giving error.
  }; 

  int main(int argc, char *argv[])
  {
      xxx x1;
      cout<<sizeof(x1); //Q=Why this code is not giving error.
      return 0;
  }
#包括
使用名称空间std;
xxx类{
public:int a[];//为什么此行没有给出错误。
}; 
int main(int argc,char*argv[])
{
xxx-x1;

不能使用符合标准的编译器。对象大小不能是
0
,即使是空的
结构
也有大小
1
。此外,必须指定数组维度

编辑:这很奇怪,ideone也打印出0。在MSV中我得到一个警告,但至少大小是1

5.3.3.尺寸
  • […]当应用于类时,结果是该类对象中的字节数[…]最派生类的大小应为 大于零。[…]将sizeof应用于基类子对象的结果是基类类型的大小。[…]
  • 编辑2:

    我在MSV中尝试了以下操作:

    xxx a[100];
    

    而且它无法编译。奇怪的是它怎么没有事先发现错误。

    对象的大小不能为零。即使类为空,它的大小也永远不会为零


    检查链接以了解更多。

    < P>正如其他人所说,C++中的对象永远不能有大小0。

    但是,由于代码最初是无效的C++(数组不能是空的),这是无关紧要的。编译器只是随心所欲。


    带有
    -pedantic
    的GCC拒绝此代码。MSVC至少会发出警告。带有
    -pedantic
    clang++
    的我的版本会发出警告,但在此之前会发出警告。

    xxx
    中的元素
    a
    称为灵活数组成员

    灵活数组成员不在C++标准中,它们是C99的一部分。然而,许多编译器厂商提供灵活的数组成员作为C++扩展。 <>你的代码不是合法的C代码。它使用C++特定的构造。你的代码很容易改变到C。把<代码>类<代码>改为<代码>结构> /CUT>,去掉<代码>公共<代码>,并将C++ I/O的使用改为C的代码> Prtff<代码>。仅允许作为非空结构的最后一个元素


    显然,您的供应商将灵活数组成员概念转换为C++,但不是约束结构是非空的。

    int a[]看起来像是一个非标准的C++扩展(C99)。一旦使用了这种扩展,就可以期待语言的其他部分(SiZeof)。行为也不符合标准。@Klaim不,如果我正确阅读了该标准,请直截了当地说,格式不正确。
    xxx
    是§8.3.4规定的不完整类型,不允许对不完整类型使用
    sizeof
    (§5.3.3)。我不确定它是否需要诊断。因此编译器允许它工作……允许一些优化技巧?@Klaim它是一个GCC扩展,用于创建与C99的兼容性,允许“灵活数组成员”(但仅作为结构中的成员)我只是使用了G+标准编译器,结果就是这样。因为我不是C++专家,我无法探索其他选项。它是否像G++编译器所做的任何解析错误。我只是用G++O选项执行的。