1

私はVC8からVC9に移植するためのかなり大きくて複雑なプログラムのセットを持っています。モジュールの1つには、いくつかの階層化されたtypedefがあり、コンパイラーはC4503警告(装飾名は切り捨てられます)を生成します。生成されたLIBファイルは、プロジェクト内の他のモジュールに適切にリンクされません。VC8はこれに問題がなく、装飾プロセスが変更されてさらに長い名前が生成されたか、装飾された名前の長さの内部制限が減少したと結論付けました。これを乗り越えるための最良の方法は何ですか?

レガシーコードの理由から、typedefをstructに置き換えるという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;
4

3 に答える 3

2

装飾された名前の長さに関するコンパイラの内部制限を増やす方法がないように見えるので、私は箇条書きをかじって、MSDN で提案された変更を行いました。参照: http://msdn.microsoft.com/en-us/library/074af4b6.aspx

最初の typedef を構造体に変更するだけで済みました。これには、レガシ コードに他に約 200 の変更が必要で、面倒ではありましたが、それ以外は難しくありませんでした。ただし、これで問題が発生していないことを確認するために、次の 1 週間程度を回帰テストに費やす予定です。

基本的な変更は次のとおりです (構造体に 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 に答える