woaidongmao

文章均收录自他人博客,但不喜标题前加-[转贴],因其丑陋,见谅!~
随笔 - 1469, 文章 - 0, 评论 - 661, 引用 - 0
数据加载中……

SIZEOF宏,弥补sizeof不足

 

POD

struct Data

{

    int a;

    int b[32];

    char c[128];

};

C/C++不能够支持如下的语法:sizeof(Data::a); sizeof(Data::b); sizeof(Data::c[0]), sizeof必须要有存在的对象,才可以进行操作,这个不好

仿照offsetof宏,定义一个SIZEOF宏:#define SIZEOF(s,m) sizeof(((s *)0)->m)

VC6下可以工作,其他环境不知

 

#define SIZEOF(s,m) sizeof(((s *)0)->m)

struct Data

{

    int a;

    int  b[32];

    char c[128];

};

 

int main(int argc, char* argv[])

{

    int z = 0;

    z = SIZEOF(Data, a);    //---- 4

    z = SIZEOF(Data, b);//---- 128

    z = SIZEOF(Data, c);//---- 128

    z = SIZEOF(Data, b[0]);//---- 4

    z = SIZEOF(Data, c[0]);//---- 1

    return 1;

}

posted on 2008-11-28 18:56 肥仔 阅读(3844) 评论(17)  编辑 收藏 引用 所属分类: C++ 基础

评论

# re: SIZEOF宏,弥补sizeof不足  回复  更多评论   

template<typename R , typename T>
size_t member_size( R T::* )
{
return sizeof(R);
}

printf( "%d\n" , member_size( &Data::c );
2008-11-28 19:57 | LOGOS

# re: SIZEOF宏,弥补sizeof不足  回复  更多评论   

0指针用来在不生成对象的情况下计算结构体成员的偏移是个很好的应用
2008-11-29 12:48 | 老狼

# re: SIZEOF宏,弥补sizeof不足  回复  更多评论   

@LOGOS
能详细的解释一下吗?
2008-11-29 14:40 | 过路人

# re: SIZEOF宏,弥补sizeof不足  回复  更多评论   

@过路人
只是一个简单的模板而已
R即成员变量的类型
2008-11-29 15:46 | LOGOS

# re: SIZEOF宏,弥补sizeof不足  回复  更多评论   

to LOGOS:你的方法很好,但有两个缺点:
1. 不能作为编译器期常量,这和sizeof的行为不一致
2. 不能用于引用类型的成员,比如
struct Data
{
int (&d4)[2];
};
2008-12-01 11:45 | 周星星

# re: SIZEOF宏,弥补sizeof不足  回复  更多评论   

@周星星
传说中挖bug狂人?
我blog偷盗了你蛮多篇文章,不要报警啊
2008-12-01 12:34 | 肥仔

# re: SIZEOF宏,弥补sizeof不足[未登录]  回复  更多评论   

不错
2008-12-01 19:11 | 王博炜

# re: SIZEOF宏,弥补sizeof不足  回复  更多评论   

@肥仔
欢迎盗版:)

@LOGOS
变为编译器期常量可以用
template<typename R,typename T> R& member_type( R T::* );
#define member_size(rt) sizeof( member_type(rt) )
但对于引用型成员变量则没有办法,我怀疑C++就不允许 R T::* 来指向引用型成员变量。
2008-12-02 09:04 | 周星星

# re: SIZEOF宏,弥补sizeof不足  回复  更多评论   

@LOGOS
文章中有这么一句话:
C/C++不能够支持如下的语法:sizeof(Data::a); sizeof(Data::b); sizeof(Data::c[0]), sizeof必须要有存在的对象,才可以进行操作,这个不好

请问,用模板是不是可以不需要存在的对象呢?
应该是要的吧?



2008-12-03 19:13 | OHFISH

# re: SIZEOF宏,弥补sizeof不足  回复  更多评论   

@OHFISH
文章的这句话。。。。
sizeof(int),sizeof(double)
Data::a既不是一个类型,也不是一个变量
2008-12-03 19:36 | LOGOS

# re: SIZEOF宏,弥补sizeof不足  回复  更多评论   

的确,既不是类型,也不是变量.
作者的方法是:sizeof(((s *)0)->m)
你的方法是:模板

我想请教一下:
你的模板在运行期是不是要创建一个对象?

楼上 老狼说:
"0指针用来在不生成对象的情况下计算结构体成员的偏移是个很好的应用"
老狼说的对吗?
如果模板在运行期要创建对象,而老狼说的又对的话,那你和作者的方法还有区别的

2008-12-03 23:44 | OHFISH

# re: SIZEOF宏,弥补sizeof不足  回复  更多评论   

@OHFISH
老狼说得对
模板不生成对象
2008-12-04 09:14 | LOGOS

# re: SIZEOF宏,弥补sizeof不足  回复  更多评论   

template<typename R , typename T>
class member_size( R T::* )
{
public:
enum {
result=sizeof(R);
};
};

cout<<member_size<&Data::a>::result<<endl;
常量了吧
2008-12-04 10:34 | vczh

# re: SIZEOF宏,弥补sizeof不足  回复  更多评论   

@vczh
这种核武器都用上了。。。

看来看去,还是宏最简洁,优美,漂亮。
2008-12-04 11:02 | 肥仔

# re: SIZEOF宏,弥补sizeof不足  回复  更多评论   

@vczh
type traits
pfpf....
2008-12-04 15:18 | LOGOS

# re: SIZEOF宏,弥补sizeof不足  回复  更多评论   

不错,学习了
2008-12-04 22:56 | 妮子

# re: SIZEOF宏,弥补sizeof不足[未登录]  回复  更多评论   

你自己定义什么类型自己难道不清楚吗?在大程序中SIZEOF宏除了可能引发混乱外,何用之有呢?
2008-12-17 20:19 | Chipset

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理