1

我有一个相当大的和复杂的程序集,从VC8端口到VC9。其中一个模块具有多个分层typedef,这会导致编译器生成C4503警告(装饰名称被截断)。生成的LIB文件将无法正确链接到项目中的其他模块。 VC8在这方面没有任何问题,这导致我得出结论,装饰过程已经改变以产生更长的名字,或者装饰名称长度的内部限制已经减少。解决这个问题的最好方法是什么?如何在VC9(MSVC 2008)中增加允许的装饰名称长度?

对于遗留代码的原因,MSDN建议用结构替换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; 
+0

只是很高兴我没有在该代码上工作。 – Kibbee 2008-11-02 01:11:40

+0

如果在构建链接到库的模块时构建库时截断的装饰名称被截断,则即使面对此警告,它是否会继续正常链接?还是你有多个符号只在截断点之后才有所不同? – GBegen 2009-02-04 18:37:32

回答

2

因为似乎没有成为一个办法增加对修饰名长度编译器的内部限制,我忍辱负重,作出改变在MSDN中建议。见:http://msdn.microsoft.com/en-us/library/074af4b6.aspx

我只到达第一个typedef改变为一个结构。这需要在遗留代码中进行大约200次其他更改,这是非常乏味的,但其他方面并不困难。不过,我将在下周左右进行回归测试,以确保这不会造成任何问题。

这是基本的变化:(请注意,我是被迫的一些构建函数添加到结构)

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; 
+0

如果你在你的结构上放了一个`operator()`或者什么的,它会以更少的代码更改的方式工作吗? – 2011-11-11 21:16:50

0
#pragma warning(disable:xxx). 

人生苦短的人。

0

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

IOW,这不仅仅是一个'警告'。它导致项目不起作用。

我发布的修复有点困难和繁琐的完全实现,但它确实有效。