Chinaunix首页 | 论坛 | 博客
  • 博客访问: 830607
  • 博文数量: 158
  • 博客积分: 4380
  • 博客等级: 上校
  • 技术积分: 2367
  • 用 户 组: 普通用户
  • 注册时间: 2006-09-21 10:45
文章分类

全部博文(158)

文章存档

2012年(158)

我的朋友

分类: C/C++

2012-11-16 13:30:36

对于以下代码:
#include
#include
using namespace std;
int main(int argc, char* argv[])
{
    struct
    {
        struct { } a;
        struct { int x; } b;
    } obj;
    cout << typeid(obj.a).name() << endl;
    cout << typeid(obj.b).name() << endl;
    cout << boolalpha << bool(typeid(obj.a)==typeid(obj.b)) << endl;
    
    system( "PAUSE" );
    return 0;
}
输出结果是:
?AU__unnamed@0?1?main@
?AU__unnamed@0?1?main@
true

obj.a和obj.b的类型名称相同勉强可以说得过去,但类型相同就属于Bug了,这个Bug属于非常低级的错误,除非特意犯傻,否则出现这样的错误是不可原谅的。我猜测不出这个Bug产生的任何可能原因,因为对于 obj.a = obj.b 编译器是知道错误的呀!

[2005/10/09日记]:
虽然结果令人不快,但它并非Bug,C++标准并没有对type_info::name()的返回值有任何约定,一个不违反规定的做法就是令所有type_info的name()都返回一个空字符串,当然,目前还没有任何一个编译器厂家敢这样调戏用户^_^。
BTW:typeid的返回类型是type_info的引用,但对于同一种类型的typeid操作返回值地址,C++标准却没有要求她们相同,没有办法,举例如下:
( &typeid(int) == &typeid(int) ) 结果未必是true,应该老实的比较type_info本身,而不是其地址。
阅读(2443) | 评论(14) | 转发(0) |
给主人留下些什么吧!~~

网友评论2012-11-16 13:31:52

johnboo
没看过C++标准,不知道是否有对匿名结构(类)的运行时识别有严格要求,如果没有的话也无可厚非。不过g++倒是实现的不错。

网友评论2012-11-16 13:31:37

周星星
1。我做事有时候不顾其他人感受,这是事实,但我觉得还没到“不厚道”的地步,能不能举个事例?
2。这些文章确实缺乏水准,但对我而言它们都很实用,即使不使用,那么它们也可能是我曾经碰到的难题,留此以纪念。Blog难道不应该随便一点?我把Blog看成是网络日记,嘻嘻!
3。“而且您总是到处给人泼冷水”,有吗?
4。“学C++的人越来越少了”,不赞同,无论从网上的统计资料(当然它们可能是假的)还是身边的公司,我都觉得C++流行得太快太快,因为现在重技术的公司越来越多,而做MIS/ERP的公司越来越少。
5。“而且您泼冷水的那些blog的主人,恕我直言,在我看来没有一个功力在您之下的。”,大抵是事实,因为我受VC毒害太深,已经毁了,但假如你的意思是只有高水平的人才能去批评低水平的人,那我不赞同。
6。“希望大家戒骄戒躁,努力学习C++,鼓励更多的人学习C++。也希望看到星哥成为真正的虚怀若谷的牛人。” 谢谢,谢谢,欢迎指教!

网友评论2012-11-16 13:31:22

星哥
星哥,继续反思一下吧。
有时候你在别的blog上的留言实在是太naive,而且显得很不厚道,就你现在发布的这些文章而言,实在是看不出您的造纸有多高,而且您总是到处给人泼冷水,何必呢,学C++的人越来越少了,能坚持写文章的就很不容易了,而且您泼冷水的那些blog的主人,恕我直言,在我看来没有一个功力在您之下的。
希望大家戒骄戒躁,努力学习C++,鼓励更多的人学习C++。也希望看到星哥成为真正的虚怀若谷的牛人。