我把我用atl写的com拿到 vs.net 2003下编译时出现以下错误:
C1001: 内部编译器错误
        (编译器文件“msc1.cpp”的第 2701 行)
        。请选择 Visual C++ 
        “帮助”菜单上的“技术支持”命令,或打开技术支持帮助文件获得详细信息
但错误都定位到系统的头文件里,
这个项目的文件肯定没有问题,在vc 6.0和vc.net 2002里都通过了,请问有没有人知道怎么解决??~~

解决方案 »

  1.   

    vs.net 2003比2002在语法方面严格了许多。我写的一些类如ado封装等,在2002下一切正常,在2003下编译不能通过。还有一个办法,关闭vs.net 2003,将DEBUG目录和*.nbc、*.aps文件删除,然后打开项目重新编译,看看能否通过……
      

  2.   

    这个方法试过了,不行.而且也不可能是语法上的问题, 因为我只要include到和atl有关的头文件就会出错。
      

  3.   

    那是你的vs.net安装有问题,2003的语法检查是比较严格,但是内部编译器错误就不是语法问题了,建议换个英文版的重新安装。
      

  4.   

    >C1001: 内部编译器错误It is a bug of Visual Studio.
      

  5.   

    估计是预编译设置的问题。
    如果你这个cpp设置为使用预编译,那么你就得把#include "stdafx.h"放在最前面,反过来,如果你不使用预编译,不能包含"stdafx.h"。
      

  6.   

    这个C1001的确很头疼的!我也碰到过很多次这样的情况,代码在其他地方都能正常工作,可是到了VS2003下面,就C1001我觉得这真是VS2003的一个大BUGarxing(阿行) 说:*******************************************************************************
    估计是预编译设置的问题。
    如果你这个cpp设置为使用预编译,那么你就得把#include "stdafx.h"放在最前面,反过来,
    如果你不使用预编译,不能包含"stdafx.h"。
    *******************************************************************************如果是预编译的问题,那么出错信息将不会是C1001,会提示用户预编译不对头。
      

  7.   

    我也认为不是预编译的问题。内部编译器错误
    (编译器文件 file,第 number 行)编译器无法生成正确的构造代码,原因可能是出自表达式与优化选项的组合。尝试移除一个或多个优化选项,并重新编译包含错误信息所指示的行的函数。
    以下是MSDN的说明,但问题是我根本就没有开任何的优化选项。
    通过移除一个或多个优化选项有可能解决该问题。若要确定哪一个选项出了问题,请一次移除一个选项并重新编译,直到错误信息消失为止。通常最有可能导致此错误的选项有 /Og、/Oi 和 /Oa。确定了哪一个选项是症结所在后,则可以对发生错误的函数使用 optimize 杂注来禁用它,并为模块的其余部分继续使用该选项。尝试重写报告错误的行或围绕该行周围的若干行。如果这不起作用,请与 Microsoft 产品支持服务联系。
      

  8.   

    http://www.sgi.com/tech/stl/stdlib_20000608.zip这个包里面是SGI STL with IOStream的版本,2002下面能正常编译拿到2003下面就有C1001错误,和楼主所述的一样!
      

  9.   

    我昨天买了.net 2003的盘,但是装不上,7 张盘下面都找不到一些升级必备的文件。原来硬盘上有个.net 2002的安装盘,但是不小心被我搞坏了//.net root/windows updata/step.sdb文件,所以也没法升级。可否提供这个文件给我[email protected]
    我相信不会是vc的bug,一定是别的地方没有做好,理论上只要是语法合适的cpp文件,肯定可以编译。
      

  10.   

    to arxing(阿行):
    安装2003并不需要2002的盘。VS上的bug也不是一个两个的事, 只不过编译器上出bug比较少而以
      

  11.   

    我用vs2002编译的com在vs2003中也可以编译和使用,但是用vs2003编译的com用ole/view查看却总是地址冲突报错,但查看2002bian编译的com就没有问题。
    怎么回事呀。
      

  12.   

    to arxing(阿行):
    你还是先学一下用VS再说吧,编译时cl内部错误,又何来跟踪调试???to lygfqy(风清扬):
    我也认为是编译选项的问题,不过我以经找他改成和2002一样还不行::我试了一下,在用了atl的项目里,如果像以下这样的代码就不能通过:
    template <typename T>
    class Cobj
    {
     public:
      T AA(void);
    };
    template<typename T>
    inline T Cobj::AA()
    {
       .........................//用到了ATL Collection里面的东西,不用有时能通过
    }
    改成以下时又能通过:
    template <typename T>
    class Cobj
    {
     public:
    inline T AA()
    {
       .........................//用到了ATL Collection里面的东西,不用有时能通过
    };
    };
      

  13.   

    跟踪调试是对 herosword(南) 说的。
    template <typename T>
    class Cobj
    {
     public:
      T AA(void);
    };
    template<typename T>
    inline T Cobj::AA()
    {
       .........................//用到了ATL Collection里面的东西,不用有时能通过
    }
    本来就错误,正确的语法是:
    template<typename T>
    inline T Cobj<T>::AA()
    {
       .........................//用到了ATL Collection里面的东西,不用有时能通过
    }
    我一直用得挺好。
      

  14.   

    不好意思,贴不了个<T>不过就算少了个<T> 也不是编译器内部错误吧??!!to arxing(阿行): 
    我想你应该知道编译器内部错误和语法错误的区别吧
      

  15.   

    这样吧,你自己给我搞一个项目,编译不过的,发到我的信箱[email protected]。不要大,把不必要的东西删去,只要把错误搞出来就行了。
      

  16.   

    不用了,有人帮我搞掂了,把 atlcoll.h放到stdafx.h里预编译就行了;不过还是不明白为什么.............  :(
      

  17.   

    我说过肯定是预编译的问题嘛。
    出错的原因很多,往往是不小心没有注意到某些小节而造成。许多头文件是相关的,它们的次序不能颠倒,把某些头文件放在预编译头文件里面是强制它在相对最前面的位置,你不放也可以解决这个问题。另外,有时候还得注意编译开关,名字空间,以及class, function相互引用的问题,它们也决定了头文件的次序。
    总之,你把每个obj单独看待,细心一点就很容易发现问题的所在了。