最近在看webkit,在WTF/wtf/OwnPtrCommon.h有一段关于sizeof的:
template <typename T> inline void deleteOwnedPtr(T* ptr)
{
typedef char known[sizeof(T) ? 1 : -1];
if (sizeof(known))
delete ptr;
}
既然webkit这么写,那么肯定合理了,于是查阅资料总结一下,sizeof的返回值:
1.正值
常见,
2.零值
确实存在0,在一下代码中:
int buf[0];
sizeof(buf) //0
有些编译器支持数组元素个数为0的,至少我在g++上就可以通过。
返回上面的webkit源码
如果sizeof(T)为0,则sizeof(known)=-1。那么,上面的代码就好理解了。
3.负值
int len = -2;
int p[len];
sizeof(p) //-8
说明了为负值的情况。
读一读webkit源码收获蛮大的,里面代码的兼容性和可移植性等确实值得学习,用到的一些技巧很能提高个人的编程内功。
注:以上所有代码均在gcc (GCC) 4.6.2 20111027 (Red Hat 4.6.2-1)上编译通过。