天天看點

VC6 之C4786 警告

  在使用std::vector的過程中,編譯器報了如下的warning:   c:/program files/vc98/include/vector(61) : warning C4786: '[email protected][email protected][email protected]@std@@[email protected]@2@@std@@[email protected][email protected][email protected]@std@@[email protected]@2@@std@@@2@@std@@[email protected][email protected]?$char_t

[email protected]@std@@[email protected]@2@@[email protected][email protected]?$[email protected][email protected]@std@@[email protected]@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>)之前,否則還是不起作用。(這一句最有用,之前我加了屏蔽語句仍然無效,原來如此。)