2011-02-12 54 views
2
#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(); 
} 

//任何人都可以幫助我理解wt宏是否計算sizeof char數據類型?該代碼如何工作來計算數據類型的sizeof?

回答

3

它分解:

#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

分解成一口大小的塊,以下僞函數達到相同的結果:

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 *並進行相減,這將產生兩個地址之間的差異(以字節爲單位)。