sizeof空结构在C中为0,在C++中为1为什么?

Nin*_*age 33 c c++ struct sizeof

可能重复:
C++中的空类C
中空结构的大小是多少?

我在某处看到C++中空结构的大小为1.所以我想到验证它.不幸的是我把它保存为C文件并使用了<stdio.h>标题,我很惊讶地看到了输出.这是0.

这意味着

struct Empty {

};

int main(void)
{
  printf("%d",(int)sizeof(Empty));
}
Run Code Online (Sandbox Code Playgroud)

在编译为C文件时打印0,在编译为C++文件时打印1.我想知道原因.我读到c ++中的sizeof空结构不为零,因为如果大小为0,则该类的两个对象将具有相同的地址,这是不可能的.我哪里错了?

Pra*_*rav 15

你不能在C中有一个空结构.这是一个语法约束违规.但是gcc允许C中的空结构作为扩展.此外,如果结构没有任何命名成员,则行为是未定义

C99 说:

如果struct-declaration-list不包含命名成员,则行为未定义.

所以

struct Empty {}; //constraint violation

struct Empty {int :0 ;}; //no named member, the behaviour is undefined.
Run Code Online (Sandbox Code Playgroud)

是的空结构的大小是C++ 不能为零 :)


vog*_*vog 9

有几个很好的理由.其中,这是为了确保指向该结构指针的指针算术不会导致无限循环.更多信息:

http://bytes.com/topic/c/insights/660463-sizeof-empty-class-structure-1-a


Nec*_*lis 6

这是一篇精彩的文章,描述了为什么会发生这种情况,并且更有针对性,一种(安全)方式:)

http://www.cantrip.org/emptyopt.html