[转]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>)之前,否则还是不起作用。
posted @   Atypiape  阅读(443)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示