无题

即兴之作.

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 );
 
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值