在使用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>)之前,否則還是不起作用。(這一句最有用,之前我加了屏蔽語句仍然無效,原來如此。)