2012-05-11 48 views
10

thể trùng lặp:
What is the size of void?Tại sao sizeof (void) == 1?

Trong §6.2.5.19, các tiên tri cho chúng tôi biết rằng:

Loại void bao gồm một tập rỗng của các giá trị

n tại sao sizeof(void) sản lượng 1, khi 0 dường như đủ?

+0

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

+0

Có sự khác biệt giữa câu hỏi này và bản sao cũ hơn của nó: câu trả lời được chấp nhận chứa ac bằng chứng tual. – Philip

+0

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

Trả lời

10

sizeof(void) sẽ không biên dịch trên một trình biên dịch C.

ISO 9899: 2011 6.2.5/19

"Loại khoảng trống bao gồm một tập hợp giá trị trống; nó không hoàn thành loại đối tượng không thể hoàn thành."

ISO 9899: 2011 6.5.3.4/1

"Các nhà điều hành sizeof sẽ không được áp dụng cho một biểu thức có kiểu hàm hoặc một loại không đầy đủ"

Đây là văn bản quy phạm : sizeof (void) không hợp lệ C.

+0

... và nó vẫn biên dịch với gcc, vì nó là phần mở rộng gcc. : //gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/Pointer-Arith.html#Pointer-Arith – Philip

+4

Tôi tự hỏi làm thế nào điều này trả lời câu hỏi của OP ... – ThiefMaster

+0

@Philip Có thực sự, nhưng nó sẽ không biên dịch trên một thực hiện phù hợp của một trình biên dịch C. – Lundin

19

Nó là một phần mở rộng gcc: http://gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/Pointer-Arith.html#Pointer-Arith

Trong GNU C, cộng và trừ các hoạt động được hỗ trợ trên các con trỏ tới void và trên con trỏ đến chức năng. Này được thực hiện bằng cách xử lý kích thước của một void hoặc của một hàm như 1.

Một hậu quả của việc này là sizeof cũng được phép trên void và trên các loại chức năng, và trả về 1.

Tùy chọn -Wpointer-arith yêu cầu cảnh báo nếu các tiện ích này được sử dụng.

Lý do tại sao void cần một kích thước để thực hiện arithmetics như vậy là ptr - ptr2 không thực sự mang đến cho bạn sự khác biệt số của địa chỉ nhưng số lượng các yếu tố hai con trỏ là ngoài - và kích thước của một phần tử chỉ vào bởi void *ptrsizeof(*ptr)sizeof(void).

+0

Nếu đây là phần mở rộng, tại sao 'gcc -std = c99 -pedantic' cho sizeof (void) == 1? -người khổng lồ đưa ra một cảnh báo cho việc sử dụng sizeof trên một loại void, nhưng mã biên dịch và in 1. – Lundin

+3

@Lundin: bởi vì bạn đã sử dụng '-pedantic' và không phải' -pedantic-errors' – Christoph

+1

@Christoph Theo ý kiến ​​của tôi, nó phải là đủ để thiết lập cờ -std = c99 và sau đó nó không nên cho phép mã biên dịch mà không có lỗi. – Lundin

7

Có thể bạn đang sử dụng gcc hoặc một số trình biên dịch khác thực hiện việc này dưới dạng tiện ích (trong C, sizeof (void) không hợp lệ).

gcc nói:

Trong GNU C, cộng và trừ các hoạt động được hỗ trợ trên con trỏ để làm mất hiệu lực và về con trỏ đến chức năng. Này được thực hiện bằng cách xử lý kích thước của một khoảng trống hoặc của một hàm như 1.

Một hậu quả của việc này là sizeof cũng được phép vào khoảng trống và trên loại chức năng, và trả về 1.

Tùy chọn -Wpointer-arith yêu cầu cảnh báo nếu các tiện ích mở rộng này được sử dụng .

+1

... và nó không hợp lệ vì §6.5.3.4.1: "Toán tử sizeof sẽ không được áp dụng cho một biểu thức có loại hàm hoặc loại không đầy đủ, với tên được đặt dấu ngoặc đơn của loại đó hoặc đến một biểu thức chỉ định một thành viên bit trường "và §6.2.5.19:" 'void' là một" loại không đầy đủ không thể hoàn thành. " – Philip

Các vấn đề liên quan