即兴之作.
struct SomeStruct
{
int iInt;
char ch;
};
SomeStruct obj;
SomeStruct * pObj;
有时候需要求obj的大小, 我喜欢用: sizeof(obj) 而不喜欢用 sizeof(SomeStruct )
因为用后者的话,我需要到头文件中去找 obj的类型.
把一个变量施加于sizeof 操作符, 有一个潜在的危险: 把指向obj对象的指针pObj错当成了obj,于是本想写:
memset(pObj, 0, sizeof(*pObj));
写成了:
memset(pObj,0,sizeof(pObj));
楼主就想要是当把一个指针施加于sizeof操作符时,编译器会提醒我,那多好啊.
写sizeof(int *)这样的代码确实没有什么意义,除忽悠找工作的应届毕业生之外.
于是楼主,想出下面这一招:
template<class T> struct TSizeOf{typedef T & ReturnT;};
template<class T> struct TSizeOf<T*>;
template<class T, int size> struct TSizeOf< T [size]> { typedef T (&ReturnT) [size];};
template<class T > typename TSizeOf<T >::ReturnT SizeOf(T);
template<class T, int size> typename TSizeOf<T [size]>::ReturnT SizeOf( T (&)[size]);
#define SIZE_OF(exp) sizeof(SizeOf(exp))
#define PTR_SIZE sizeof(void *)
#include <iostream>
void func(SomeStruct marray[])
{
std::cout << "sizeof(marray) = " << SIZE_OF(marray); //NG,因为marray实际上是指针
}
void main()
{
std::cout << "sizeof(obj) = " << SIZE_OF(obj) ; //OK
std::cout << "sizeof(pObj) = " << SIZE_OF(pObj); //NG,通不过编译
SomeStruct marray [100];
std::cout << "sizeof(marray) = " << SIZE_OF(marray); //OK
func(marray );
}