Как увеличить допустимую длину декорированного имени в VC9 (MSVC 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 ответа
Поскольку, похоже, нет способа увеличить внутреннее ограничение компилятора на длину оформленного имени, я прикусила маркер и внесла изменения, предложенные в 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;
@Roel: Как я уже упоминал в оригинальной публикации: "Сгенерированный LIB-файл не будет правильно связываться с другими модулями в проекте".
IOW, это больше, чем просто "предупреждение". Это заставляет проект НЕ РАБОТАТЬ.
Мое опубликованное исправление довольно сложно и утомительно полностью реализовать, но оно работает.