zoukankan      html  css  js  c++  java
  • [转]VC++ warning C4786 详解

    在使用std::vector的过程中,编译器报了如下的warning:
     
    c:/program files/vc98/include/vector(61) : warning C4786: '??0?$vector@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@@std@@QAE@PBV?$basic_string@DU?$char_t
    raits@D@std@@V?$allocator@D@2@@1@0ABV?$allocator@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@1@@Z : identifier was truncated to '255' characters in the browser information
            d:/rtd/ruleloader/treenode.h(15) : see reference to class template instantiation 'std::vector<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::allocator<class std::basic_string<char,struct st
    d::char_traits<char>,class std::allocator<char> > > >' being compiled
     
    此warning产生的原因是因为标识符过长,超过了最大限定255个字。例如:
    #define a_really_long_class_name a_really_really_really_really_really_really_really_ /
    really_really_really_really_really_really_really_really_really_really_really_really_ /
    really_really_really_really_really_really_really_really_really_really_really_really_really_really_really
     
     class a_really_long_class_name
    {
    public:
       a_really_long_class_name() {};
       int m_data;
    };
    void main()
    {
        a_really_long_class_name test_obj;
        test_obj.m_data = 12;
    }
    类名超过了255个字,使用时就会报4786的waring。在使用STL(C++标准模板库)的时候经常引发类似的错误,尤其是vector,map这类模板类,模板中套模板,一不小心就超长了。例如:
     
    template <class A1, class A2, class A3, class A4>
    class VeryLongClassNameA{};

    template <class B1, class B2, class B3>
    class VeryLongClassNameB{};

    template <class C1, class C2>
    class VeryLongClassNameC{};

    template <class D1>
    class VeryLongClassNameD{};

    class SomeRandomClass{};

    typedef VeryLongClassNameD<SomeRandomClass> ClassD ;
    typedef VeryLongClassNameC<SomeRandomClass, ClassD> ClassC;
    typedef VeryLongClassNameB<SomeRandomClass, ClassC, ClassD> ClassB;
    typedef VeryLongClassNameA<SomeRandomClass, ClassB, ClassC, ClassD> ClassA;

    void SomeRandomFunction(ClassA aobj){}

    void main()
    {
       ClassA AObj ;
       SomeRandomFunction(AObj) ;
    }
     
    解决方法有两种,一种是直接定义别名:
    #ifdef _DEBUG
    #define VeryLongClassNameA A
    #define VeryLongClassNameB B
    #endif

    另一种是屏蔽4786warning:
    #pragma warning(disable : 4786)
     
    注意屏蔽语句必须放在报错的模板类的引用声明(如#include <vector>)之前,否则还是不起作用。
  • 相关阅读:
    poj1321(棋盘问题)
    poj3009(Curling 2.0)
    站点 1访问非本站点下面的web.config文件需要的权限
    VS2010 Web网站发布详解
    服务禁止旁注,安全设置
    在Windows2012下安装SQL Server 2005无法启动服务的解决办法
    Server-U与IIS端口占用问题解决
    Server-U_详细配置
    创建维护计划时,提示“代理XP”组件已作为此服务器安全配置的一部分被关闭
    SQL SERVER 2005如何建立自动备份的维护计划
  • 原文地址:https://www.cnblogs.com/wxxweb/p/2325411.html
Copyright © 2011-2022 走看看