Chinaunix首页 | 论坛 | 博客
  • 博客访问: 902569
  • 博文数量: 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本身,而不是其地址。
阅读(2488) | 评论(14) | 转发(0) |
给主人留下些什么吧!~~

网友评论2012-11-16 13:34:23

周星星
:)你没有仔细看我这篇文章所想表达的意思
我并不是批评VC6存在这个bug,而是觉得这个bug有点离奇,我猜想是有两部人来实现这个功能,而相互间没有沟通。

网友评论2012-11-16 13:34:09

xx
Bug谁多谁少很难说啊 6毕竟是98年的产品 应该跟当时版本的gcc比较才有意义 大部分vc++用户是输出个hello world之类的说法就有点儿戏了

网友评论2012-11-16 13:33:53

昆仑
不知道如果struct {int s;} a的结果会如何。我试试。

呵呵。星星说真正的程序员如何如何的。呵呵对此我不以为然。难道做一个真正的程序员真的那么重要?:)

网友评论2012-11-16 13:33:41

ilovevc
对RTTI等typeid用法最好的解释可能是Bjarne的<D&E>中提到的"洋葱头"设计, 用处还是很大的.  
感觉真正的C/C++程序员无说不在, 不能说Unix/Linux就如何, 很多从未听说过的操作系统, 嵌入式, 包括Windows下都有"真正"的C/C++程序员. 不过大部分确实都是GCC编译器.

网友评论2012-11-16 13:33:26

周星星
1. typeid提供的不是DEBUG信息,而是运行时动态类型信息,跟DEBUG是不相干的两回事。

2. 用的人少是导致BUG难被发现的一个因素,但Bug的多少不能仅由一个因素来决定,你以偏概全了。GCC作为自由软件有两个VC所不可能具有的优点:
a. VC++的开发群体是M$公司成员,GCC的开发群体是全世界的爱好者。三个臭皮匠还能顶一个诸葛亮呐,BUG自然要少一些。
b. GCC是开源的,而VC++不是。也就是说用户对于GCC既可以做黑盒测试也可以做白盒测试,而对于VC++只能做黑盒测试,你认为 黑盒测试+百盒测试 所能发现的错误多,还是仅能 黑盒测试 发现的错误多?

另外,我要告诉你GCC是整个开源的基石,甚至Linux都是由其来编译,也许使用VC++的人比使用GCC的人多,但大部分VC++用户只是输出个Hello world,和GCC的用户层次不一样,真正的C/C++程序员大部分还是在Unix/Linux上工作。