我有一组相当大且复杂的程序要从 VC8 移植到 VC9。其中一个模块具有许多分层的 typedef,这会导致编译器生成 C4503 警告(修饰名被截断)。生成的LIB文件将无法正确链接到项目中的其他模块。 VC8 对此没有遇到任何问题,这让我得出结论,要么修饰过程已更改以生成更长的名称,要么修饰名称长度的内部限制已减少。克服这个问题的最佳方法是什么?
由于遗留代码的原因,MSDN 建议用结构替换 typedef 是不切实际的。
有问题的 typedef 是(经过清理的代码):
enum Type{
TYPE_COUNT,
TYPE_VALUE
};
typedef MyVector< Container*, CriticalSectionLock > Containers;
typedef MyVector< MyClassType*, CriticalSectionLock >::const_iterator const_iterator_type;
typedef MyVector< stl::pair< string, Type > >::const_iterator const_iterator_def;
typedef MyVector< Container** >::const_iterator const_iterator_container;
typedef MyVector< stl::pair < MyBase*, MyVector< stl::pair< Container**, Containers* > > > >::const_iterator const_iterator;
由于似乎没有办法增加编译器对修饰名称长度的内部限制,因此我硬着头皮进行了 MSDN 中建议的更改。看:http://msdn.microsoft.com/en-us/library/074af4b6.aspx
我只需要将第一个 typedef 更改为结构体。这需要对遗留代码进行大约 200 个其他更改,这很乏味,但在其他方面并不困难。然而,我将在下周左右进行回归测试,以确保这不会搞砸一些事情。
这是基本的更改:(请注意,我被迫向结构中添加一些 ctor)
enum Type{
TYPE_COUNT,
TYPE_VALUE
};
struct Containers
{
MyVector<Container*, CriticalSectionLock > Element;
Containers(int num, Container* elem):Element(num, elem){}
Containers(){}
};
typedef MyVector< MyClassType*, CriticalSectionLock >::const_iterator const_iterator_type;
typedef MyVector< stl::pair< string, Type > >::const_iterator const_iterator_def;
typedef MyVector< Container** >::const_iterator const_iterator_container;
typedef MyVector< stl::pair < MyBase*, MyVector< stl::pair< Container**, Containers* > > > >::const_iterator const_iterator;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)