sizeof празна структура е 0 в C и 1 в C++ защо?

Възможни дубликати:
Празен клас в C++
Какъв е размерът на празна структура в C ?

Прочетох някъде, че размерът на празна структура в C++ е 1. Така че реших да го проверя. За съжаление го запазих като C файл и използвах <stdio.h> заглавка и бях изненадан да видя резултата. Беше 0.

Това означава

struct Empty {

};

int main(void)
{
  printf("%d",(int)sizeof(Empty));
}

отпечатваше 0, когато беше компилиран като C файл и 1, когато беше компилиран като C++ файл. Искам да знам причината. Четох, че sizeof празна структура в C++ не е нула, защото ако размерът беше 0, тогава два обекта от класа ще имат един и същ адрес, което не е възможно. Къде греша?


person Ninad Page    schedule 03.10.2010    source източник
comment
-1 Не, не сте компилирал това като C.   -  person pmg    schedule 03.10.2010
comment
@Ninad : Опитахте ли това?   -  person Prasoon Saurav    schedule 03.10.2010
comment
Когато задавате въпроси на това езиково ниво, моля, включете името и версията на компилатора.   -  person Andy Dent    schedule 03.10.2010
comment
Това е супер-дубликат. За C, дубликат на това (отговор : неправилно е оформено). В C++, това (отговор: трябва да има размер, по-голям от нула, за да може да бъде разпределено място за него).   -  person GManNickG    schedule 03.10.2010
comment
@GMan : О, по дяволите! Мислех, че наистина е добър въпрос, но глупак :) Благодаря за връзките.   -  person Prasoon Saurav    schedule 03.10.2010
comment
-1 и от мен. sizeof не може да се компилира   -  person Johannes Schaub - litb    schedule 03.10.2010
comment
Защо не публикувате отговор, обясняващ го, вместо да гласувате против?   -  person chakrit    schedule 03.10.2010
comment
@chakrit обичам да публикувам отговори на действителни въпроси.   -  person Johannes Schaub - litb    schedule 03.10.2010
comment
@chakrit: дублиращите се въпроси не изискват никакъв отговор, те просто трябва да бъдат пренасочени към техния двойник.   -  person Matthieu M.    schedule 03.10.2010


Отговори (3)


Не можете да имате празна структура в C. Това е нарушение на синтактичното ограничение. Въпреки това gcc позволява празна структура в C като разширение. Освен това поведението е недефинирано, ако структурата няма назован член, защото

C99 казва:

Ако struct-declaration-list не съдържа именувани членове, поведението е недефинирано.

So

struct Empty {}; //constraint violation

struct Empty {int :0 ;}; //no named member, the behaviour is undefined.

И да, размерът на празна структура е C++ не може да бъде нула :)

person Prasoon Saurav    schedule 03.10.2010

Има няколко добри причини. Между другото, това е да се гарантира, че аритметиката на указателя над указателите към тази структура не води до безкраен цикъл. Повече информация:

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

person vog    schedule 03.10.2010

Ето една чудесна статия, описваща защо това се случва, и по-уместно, (безопасен) начин да го заобиколите :)

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

person Necrolis    schedule 03.10.2010