Как увеличить допустимую длину декорированного имени в VC9 (MSVC 2008)? - PullRequest
1 голос
/ 07 октября 2008

У меня довольно большой и сложный набор программ для портирования с VC8 на VC9. Один из модулей имеет несколько многоуровневых typedef, которые заставляют компилятор генерировать предупреждение C4503 (урезанное имя украшено). Сгенерированный файл LIB не будет правильно связываться с другими модулями в проекте. У VC8 не было никаких проблем с этим, что привело меня к выводу, что либо процесс оформления изменился, чтобы генерировать еще более длинные имена, либо уменьшился внутренний предел длины украшенного имени. Какой лучший способ преодолеть это?

По причинам, связанным с устаревшим кодом, предложение MSDN о замене typedef на структуры нецелесообразно.

Рассматриваемые typedefs (санированный код):

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;

Ответы [ 3 ]

2 голосов
/ 20 октября 2008

Поскольку, похоже, нет способа увеличить внутреннее ограничение компилятора на длину оформленного имени, я прикусила маркер и внесла изменения, предложенные в MSDN. см .: http://msdn.microsoft.com/en-us/library/074af4b6.aspx

Мне нужно было только изменить первый typedef на struct. Это потребовало около 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 голосов
/ 22 января 2009

@ Roel: Как я уже упоминал в исходном сообщении: «Сгенерированный LIB-файл не будет правильно связываться с другими модулями в проекте».

Итак, это больше, чем просто «предупреждение». Это заставляет проект НЕ РАБОТАТЬ.

Мое опубликованное исправление несколько сложно и утомительно полностью реализовать, но оно работает.

0 голосов
/ 19 декабря 2008
#pragma warning(disable:xxx).

Жизнь слишком коротка, человек.

...