2012-05-11 24 views
10

Powiel możliwe:
What is the size of void?Dlaczego sizeof (void) == 1?

W §6.2.5.19 prorocy niech nam wiedzieć, że:

Typ void obejmuje pusty zbiór wartości

The n dlaczego sizeof(void) daje 1, gdy 0 wydaje się wystarczać?

+0

http://stackoverflow.com/questions/1666224/what-is-the-size-of-void –

+0

Istnieje różnica między tym pytaniem a jego starszym duplikatem: ten jest zaakceptowana odpowiedź zawiera ac dowód tual. – Philip

+0

http://meta.stackexchange.com/questions/32311/do-not-delete-duplicates – Flexo

Odpowiedz

10

sizeof(void) nie opracowania w kompilator C.

ISO 9899: 2011 6.2.5/19

"Typ pustki zawiera pusty zbiór wartości, jest to niekompletny obiekt typu , którego nie można ukończyć."

ISO 9899: 2011 6.5.3.4/1

"Operator sizeof nie stosuje się do wyrażenia, które ma typ funkcji lub niekompletne typu"

To jest tekst normatywny : sizeof (void) nie jest prawidłowy C.

+0

... a mimo to kompiluje się z gcc, ponieważ jest rozszerzeniem gcc. : //gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/Pointer-Arith.html#Pointer-Arith – Philip

+4

Zastanawiam się, jak to odpowiada na pytanie OP ... – ThiefMaster

+0

@Philip Tak, rzeczywiście, ale będzie nie kompiluje się na zgodnej implementacji kompilatora C. – Lundin

19

Jest to rozszerzenie gcc: http://gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/Pointer-Arith.html#Pointer-Arith

W GNU C, operacje dodawania i odejmowania są obsługiwane na wskaźniki do void i wskaźniki do funkcji. Odbywa się to poprzez traktowanie wielkości void lub funkcji jako 1.

Konsekwencją tego jest fakt, sizeof jest również akceptowane na void oraz rodzajów czynności i zwraca 1.

Opcja -Wpointer-arith wnioski ostrzeżenie, jeśli te rozszerzenia są używane.

Powodem void potrzebuje wielkości do wykonywania takich arytmetyki jest ptr - ptr2 faktycznie nie daje różnicę numerycznych adresów ale liczbę elementów oba wskaźniki są od siebie - a wielkość elementu wskazywanego przez void *ptr jest sizeof(*ptr), który jest sizeof(void).

+0

Jeśli to jest rozszerzenie, dlaczego 'gcc -std = c99 -pedantic' daje sizeof (void) == 1? -pedantic wyświetla ostrzeżenie o używaniu sizeof na pustym typie, ale kod kompiluje i drukuje 1. – Lundin

+3

@Lundin: ponieważ użyłeś '-pedantic', a nie' -pedantic-errors'' – Christoph

+1

@Christoph Moim zdaniem, powinno być wystarczające do ustawienia flagi -std = c99, a następnie nie powinno pozwolić nawet na kompilowanie kodu bez błędów. – Lundin

7

Prawdopodobnie używasz gcc lub jakiegoś innego kompilatora, który robi to jako rozszerzenie (w C, sizeof (void) jest nieprawidłowe).

gcc mówi:

W GNU C, operacje dodawania i odejmowania są obsługiwane na wskaźniki do unieważnienia i wskaźniki do funkcji. Odbywa się to poprzez traktowanie wielkości próżni lub funkcji jako 1.

Konsekwencją tego jest, że sizeof jest również akceptowane na nieważne i na typów funkcji i zwraca 1.

Opcja -Wpointer-arith żąda ostrzeżenia, jeśli te rozszerzenia są używane.

+1

... i jest nieważny z powodu § 6.5.3.1.1: "Operator sizeof nie zostanie zastosowany do wyrażenia, które ma typ funkcji lub niekompletnego typu , do nazwy rodzicielskiej tego typu lub do wyrażenie określające element pola bitowego "oraz §6.2.5.19:" void "jest" niekompletnym typem, którego nie można zakończyć. " – Philip