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

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

fff
#include <stdio.h>
#include <iostream>
using namespace std;
struct
    {
        struct { } a;
        struct { int x; } b;
    } obj;
int main(int argc, char* argv[])
{
    cout << typeid(obj.a).name() << endl;
    cout << typeid(obj.b).name() << endl;
&n

网友评论2012-11-16 13:32:54

Lixeon
所以我用了半年的DevC++
后来用了VC 2005 Express
遗憾的是还要装个.net 2

网友评论2012-11-16 13:32:38

周星星
我同意,我之所以说VC++6.0有Bug而不说VC.net有Bug,是因为我根本就不用烂烂的VS.net,呵呵!
不过VC++6.0的Bug也太多了,多到我已经快记不住,更主要的是她对C++标准的支持落后,我不明白为什么M$不再升级VC++6.0?VC.net的界面和使用方法都很弱智,跟VB类似,而且Managed C++和C++/CLI毕竟跟C++没有任何关系,除了语法看起来有一点点相像以外。
C++设计有个宗旨:don't pay for what don't use,这个Managed C++和C++/CLI就是don't use,所以我说VC.net不是C++编译器,因为它跟C++设计宗旨相悖(哈哈,瞎说说,装疯瞎说)

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

leak
总的来说,微软提供的VC 6。0我是非常喜欢的,用起来就是爽啊!

网友评论2012-11-16 13:32:06

烂VC
VC就是垃圾就是烂东西,微软给我们程序员用的东西错漏百出,唉