4

我将对象的 sizeof 设为零,这是不应该的。请解释一下为什么编译器给出这个答案的概念?

  #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;
  }
4

4 回答 4

4

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

但是,由于代码首先不是有效的 C++(数组不能为空),因此这无关紧要。编译器只是做它想做的事。

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

于 2012-04-27T10:08:40.647 回答
2

您没有使用符合标准的编译器。一个对象的大小不能是0,甚至是一个空的classstruct有大小1。此外,必须指定数组维度。

编辑:很奇怪,ideone 也打印出 0。在 MSVS 中我收到警告,但至少大小为 1。

5.3.3. 大小

  1. [...] 当应用于一个类时,结果是该类的对象中的字节数 [...] 最派生类的大小应大于零。[...] 将 sizeof 应用于基类子对象的结果是基类类型的大小。[...]

编辑2:

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

xxx a[100];

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

于 2012-04-27T10:01:20.410 回答
2

a您类中的该元素xxx称为灵活数组成员。

Flexible array members are not in the C++ standard. They are a part of C99. However, many compiler vendors provide flexible array members as a C++ extension.

Your code as-is is not legal C code. It uses C++ specific constructs. Your code is easy to change to C. Change the class to struct, get rid of the public, and change the use of C++ I/O to C's printf. With those changes, your converted code is still illegal C99 code. Flexible array members are only allowed as the last element of a structure that is otherwise non-empty.

Apparently your vendor took the flexible array member concept over to C++, but not the constraint that the structure be otherwise non-empty.

于 2012-04-27T10:34:16.193 回答
1

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

查看链接以了解更多Bjarne Stroustrup 的 C++ 样式和技术常见问题解答

于 2012-04-27T10:07:52.027 回答