как этот код работает для вычисления sizeof типа данных? - PullRequest
2 голосов
/ 12 февраля 2011
#include <stdafx.h>
#include <stdio.h>
#include <conio.h>
#include<stdlib.h>
#define My_Sizeof(type) ((char*)((type*)0 +1) - (char*)(type*)0)
void main()
{
    char a='1';
    int b=My_Sizeof(int);
    printf("size is %d",b);
    _getch();
}

// Кто-нибудь может мне помочь понять, что делает макрос для вычисления размера типа данных char?

Ответы [ 2 ]

3 голосов
/ 12 февраля 2011

Разбить:

#define My_Sizeof(type) ((char*)((type*)0 +1) - (char*)(type*)0)

(char*)(type*)0 равен нулю

(type*)0 +1 делает арифметику указателей, используя указатели типа (type *), поэтому (type *)0 + 1 будет указателемсмещение точно 0 + 1 * sizeof(type) = sizeof(type) байтов

Когда разница принимается за (type *), разница составляет 1.Когда разница берется с обоими типами (char *), разница составляет sizeof(T) - 0 = sizeof(T)

3 голосов
/ 12 февраля 2011

Разбивая его на куски размером в прикус, следующая псевдофункция достигает того же результата:

size_t My_Sizeof(type) {
    type* elem0 = (type*)0;
    type* elem1 = (type*)0 + 1;
    char* elem0_addr = (char*)elem0;
    char* elem1_addr = (char*)elem1;
    return elem1_addr - elem0_addr;
}

Выражение вычисляет адреса элементов в массиве из двух элементов, номинально расположенных в нулевомадрес указателя.Затем он преобразует оба адреса в char * и вычитает, что дает разницу между двумя адресами в байтах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...