我得到的对象大小为零,这是不应该的。请向我解释一下编译器为什么给出这个答案的概念?
#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;
}
正如其他人所说,C++ 中的对象的大小永远不可能为 0。
但是,由于代码首先不是有效的 C++(数组不能为空),所以这是无关紧要的。编译器只是做它想做的事。
GCC 与
-pedantic
拒绝此代码。 MSVC 至少发出警告。我的 clang++
版本带有 -pedantic
ICE,但在此之前确实发出了警告。
您没有使用符合标准的编译器。对象大小不能是
0
,即使是空的 class
或 struct
也有大小 1
。此外,必须指定数组维度。
编辑:很奇怪,ideone 也打印出 0。在 MSVS 中我收到警告,但至少大小是 1。
- [...] 当应用于类时,结果是该类的对象中的字节数 [...] 最派生类的大小应 大于零。 [...] 将 sizeof 应用于基类子对象的结果是基类类型的大小。 [...]
编辑2:
我在 MSVS 中尝试了以下操作:
xxx a[100];
并且无法编译。奇怪的是它没有事先发现错误。
您的类
a
中的元素 xxx
称为灵活数组成员。
灵活数组成员不在 C++ 标准中。它们是 C99 的一部分。然而,许多编译器供应商提供灵活的数组成员作为 C++ 扩展。
您的代码原样不是合法的 C 代码。它使用 C++ 特定的构造。您的代码很容易更改为 C。将
class
更改为 struct
,去掉 public
,并将 C++ I/O 的使用更改为 C 的 printf
。经过这些更改,您转换后的代码仍然是非法的 C99 代码。灵活数组成员仅允许作为结构的最后一个元素,否则该结构为非空。
显然你的供应商将灵活的数组成员概念转移到了 C++ 中,但没有限制结构必须为非空。
对象的大小不能为零。即使类是空的,它的大小也永远不会为零。
查看链接以了解更多信息 Bjarne Stroustrup 的 C++ 风格和技术常见问题解答。