埋怨一下,现在的C++竟然不能这样使用sizeof(class::member)

rickerliang 2009-04-09 10:32:21
最近由于工程的需要,要为一个已有的类定义一个辅助类,打算使用宏,例如
struct something
{
int someint;
};

#define HELPERFIELD(x,y) char y[sizeof(x::y)+4] // 4个字节的扩展内容

struct somethinghelper
{
HELPERFIELD(something,someint);
// 宏展开就是
// char someint[4+4];
};
ms的C++8.0编译器不能通过编译,google了一下,说现时为止,sizeof只能这样用sizeof(object.member)却不能sizeof(class::member)(非静态),这不太搞笑了吗!!!非要我这样写sizeof((something*)0)->someint_kind)),晕倒

听说新标准支持这样的写法,希望新标准赶快到来
...全文
239 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
rickerliang 2009-04-10
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 qqwx_1986 的回复:]
首先你要搞懂 A::a(非静态)这是什么东西
[/Quote]

首先你要看10楼我的观点或者
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2253.html
rickerliang 2009-04-09
  • 打赏
  • 举报
回复
在一般情况下,class::member表明你要访问这个成员变量
但是,你是否明白sizeof的作用,sizeof只存在与编译时期,并不会生成任何试图访问class::member的代码,根本谈不上引用不引用,私有公有之类的,这与模板推导原理是一样的,编译器完全有能力嗅探到这一行为。

另外,ls有朋友用现时的标准来衡量这个帖子,我觉得出发点是好的,但是,标准是死的,人是活的,发现不合理的地方要提出,固步自封,只会落后。为什么不觉得好笑,是因为你根本想都没想过这个问题,说话有点过了。

我也可以明确指出,新标准并不是引入什么类型信息来改进sizeof的,引入额外类型信息已偏离c++的初衷,新标准是从编译器出发,辅以语言要素要求编译器要有更强悍的静态类型推导能力。
helpxs 2009-04-09
  • 打赏
  • 举报
回复
好像是的!
Paradin 2009-04-09
  • 打赏
  • 举报
回复
不搞笑啊。
难道原来可以?
zgjxwl 2009-04-09
  • 打赏
  • 举报
回复
[Quote=引用楼主 rickerliang 的帖子:]
sizeof只能这样用sizeof(object.member)却不能sizeof(class::member)(非静态),这不太搞笑了吗!!!
[/Quote]
首先。。非静态的成员是不能直接通过类名来引用的吧。即不能class::member来使用吧。既然不能这样用,何以来用sizeof它呢。。
明显,通过类名可以引用类的静态成员,故可以使用sizeof(class::member)(静态),当然,首先要通过类能访问到它。
old-six-programmer 2009-04-09
  • 打赏
  • 举报
回复
首先不考虑访问限定
用class::member_variant引用的类的非静态成员变量本来就不存在
所以,我觉得不是很搞笑
可能,新标准会加入类的类型信息,类似traits
这样就可以方便sizeof等操作符的引用
zgjxwl 2009-04-09
  • 打赏
  • 举报
回复
看看。。没那样写过。。
beyond071 2009-04-09
  • 打赏
  • 举报
回复
学习中
  • 打赏
  • 举报
回复
..接分的
cyldf 2009-04-09
  • 打赏
  • 举报
回复
学习~~
HelloDan 2009-04-09
  • 打赏
  • 举报
回复
JF-17
wind_breez 2009-04-09
  • 打赏
  • 举报
回复
学习了
qqwx_1986 2009-04-09
  • 打赏
  • 举报
回复
首先你要搞懂 A::a(非静态)这是什么东西
rickerliang 2009-04-09
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 seeze 的回复:]
如果是一个模板类呢,sizeof的结果是什么
[/Quote]

模板不模板毫无关系,在sizeof起作用的时后,模板早已实体化了
wxgiter 2009-04-09
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 fyzqzpd 的回复:]
赞一个,C++竟然可以这样使用(*p).x;
[/Quote]

这个很正常吧?只要*p是个对象,x是其成员。。。
aaaa3105563 2009-04-09
  • 打赏
  • 举报
回复
学习···········
zhao1zhong6 2009-04-09
  • 打赏
  • 举报
回复
赞一个,C++竟然可以这样使用(*p).x;
Zedee 2009-04-09
  • 打赏
  • 举报
回复
如果是一个模板类呢,sizeof的结果是什么

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧