1

我有一组相当庞大和复杂的程序可以从 VC8 移植到 VC9。其中一个模块有许多分层的 typedef,这会导致编译器生成 C4503 警告(装饰名称被截断)。生成的 LIB 文件将无法正确链接到项目中的其他模块。VC8 对此没有任何问题,这使我得出结论,要么修饰过程已更改为生成更长的名称,要么已减少修饰名称长度的内部限制。克服这个问题的最好方法是什么?

由于遗留代码的原因,MSDN 建议用结构替换 typedefs 是不切实际的。

有问题的 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;
4

3 回答 3

2

由于似乎没有办法增加编译器对修饰名称长度的内部限制,所以我硬着头皮做了 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;
于 2008-10-20T16:02:00.097 回答
0

@Roel:正如我在原始帖子中提到的:“生成的 LIB 文件将无法正确链接到项目中的其他模块。”

IOW,这不仅仅是一个“警告”。它导致项目不工作。

我发布的修复程序完全实施起来有些困难和乏味,但它确实有效。

于 2009-01-21T21:00:26.157 回答
0
#pragma warning(disable:xxx).

人的生命太短暂了。

于 2008-12-19T14:56:42.803 回答