В чем разница между следующим кодом и почему используется приведение типов - PullRequest
0 голосов
/ 21 февраля 2012

Я пишу следующий размер макроса, я хотел бы знать разницу.

#define my_sizeof(type) (char*)(&type+1)-(char*)(&type)

#define my_sizeof(type) (void*)(&type+1)-(void*)(&type)

1-й вопрос: почему требуется приведение типов, я знаю, что если я не набираю приведение типов, оно всегда возвращает 1, я проверял его при запуске. Я хочу знать значение (я имею в виду то, что он говорит компилятору).

2ndly

Какая разница с char * и void *.?

Большое спасибо.

1 Ответ

2 голосов
/ 21 февраля 2012

По второму вопросу: Вы вообще не можете этого сделать, поскольку отсутствует арифметика указателей для пустых указателей (или для указателей на неполные типы вообще, в этом отношении).

Для первой части:По определению sizeof(char) == 1, поэтому, приведя указатели к указателям на символы, вы получите разницу в единицах 1, а не в единицах sizeof(type) - другими словами, вы получите именно значение sizeof(type).

...