Какие изменения кода требуются для переноса C ++ с VS2003 на VS2005? - PullRequest
2 голосов
/ 13 ноября 2008

Мы рассматриваем вопрос о переносе сборки win32 нашего кроссплатформенного приложения C ++ из MS Visual Studio 2003 в MS Visual Studio 2005. (Да, мы очень дальновидны;)

Стоит ли ожидать много изменений в коде, чтобы он скомпилировался и работал?

Ответы [ 8 ]

6 голосов
/ 13 ноября 2008

Я только что перенес сравнительно большую кодовую базу с VS2003 на VS2008 через VS2005, и большинство проблем, которые я обнаружил, были постоянными / неконстантными проблемами, такими как присвоение возвращаемого значения функции, которая возвращает const char * для char *. И VS2005, и VS2008 гораздо более требовательны, когда дело доходит до правильности констант, и если ваша существующая кодовая база немного небрежна, извините, старая школа, когда дело доходит до константности, вы увидите много этого.

Очень долгожданным изменением стало то, что поддержка шаблонов в VS2005 заметно лучше, чем в VS2003 (сам по себе большое улучшение в более ранних версиях), что позволило мне исключить несколько обходных путей для проблем, связанных с шаблонами, которые перетаскивала команда. вокруг с бурных дней VC ++ 4.x.

Одной из проблем, с которой вы, вероятно, столкнетесь, являются тонны предупреждений о «устаревших» или «небезопасных» функциях, особенно если вы используете строковые функции Си. Многие из них «устарели от Microsoft» (только из-за того, что они исключили часть «от Microsoft») и по-прежнему идеально подходят для использования, но являются потенциальными источниками переполнения буфера. В проектах, которые я конвертировал, я установил препроцессор определение _CRT_SECURE_NO_WARNINGS и отключил предупреждение C4996, чтобы отключить эти несколько раздражающие сообщения.

Другая проблема, с которой мы столкнулись, заключается в том, что MS изменила размер по умолчанию time_t либо в VS2005, либо в VS2008 (извиняюсь, но не помню - он определенно в VS2008, но, возможно, уже в VS2005), так что если вы необходимо связать со старыми библиотеками, которые используют time_t в интерфейсе, вам придется использовать _USE_32BIT_TIME_T, чтобы вернуться к поведению старого компилятора.

Если ваше решение содержит несколько проектов, вы можете обнаружить, что функция параллельной сборки (которая включена по умолчанию) выделит отсутствующие зависимости сборки. поэтому проекты неожиданно создаются в неправильном порядке, но магически создаются правильно, если вы возвращаетесь из параллельной сборки обратно в линейную.

В целом я предпочитаю VS2005 / 8 VS2003, и я бы рекомендовал обновить до VS2008, если это возможно, поскольку компилятор "лучше", чем VS2005 - MS, похоже, приложила огромные усилия для улучшения нативного C ++ компилятор. Часть этого уже была заметна в 2005 году, поэтому вы получите хотя бы часть преимуществ, даже если будете придерживаться 2005 года.

5 голосов
/ 13 ноября 2008

Если ваш код уже достаточно чистый и компилируется без предупреждения, это не большой шаг.

Проверьте эту статью и подумайте, насколько велико влияние этих изменений на существующий код. Очистка контура для цикла может быть немного трудной.

Вы можете получить бесплатную экспресс-версию Visual Studio 2005 здесь .

4 голосов
/ 13 ноября 2008

Вы должны просмотреть списки критических изменений MS, когда решаете, стоит ли и как проводить этот проект.

критические изменения VC 2005 - 2008

Срочные изменения в компиляторе Visual C ++ 2005

Прекращение изменений в Visual C ++ .NET 2003

2 голосов
/ 13 ноября 2008

вы найдете множество строковых команд, которые будут предупреждать вас, поскольку в 2005 году они повысили уровень безопасности, чтобы попытаться остановить буфер из-за прогонов.

ваш код 2003 все равно будет компилироваться.

1 голос
/ 13 ноября 2008

Я недавно преобразовал 10-летнюю программу VC6 в VS2008. Это не требовало никаких изменений в исходном коде, и только изменения, необходимые для файлов проекта, были обработаны мастером обновления.

0 голосов
/ 25 декабря 2008

Если ваш исходный код соответствует стандарту C ++, вам не нужно ничего менять, чтобы перейти на 2005 год. Вы можете получить некоторые устаревшие предупреждения, но ничего, что не должно вызывать ошибки компиляции.

Основная проблема, с которой сталкиваются люди при переходе от более старых версий VS к более новым, заключается в том, что более новые версии более соответствуют стандартам.

Такие вещи, как:

for(i = 0; i < length; ++i)
{
}

, когда i не определено до этого момента, отлично работает в предыдущих версиях VS, но в 2005 году он правильно помечает i как неопределенную переменную.

0 голосов
/ 25 декабря 2008

Кроме того, отключение консидером проверенных итераторов или производительность может ухудшиться после переноса на новую версию.

0 голосов
/ 13 ноября 2008

Нет. Я не ожидал бы больше, чем несколько.

Редактировать: вы должны / могли попробовать код с демо-версии vs2005.

...