Как Перенести существующий код C++ на C++11

мы работаем над модулем, который разработан на C++, но, учитывая новый C++11, я думаю о переходе на это.

Как поступить? Оба они одинаковы или есть какая-то зависимость компилятора?

мое программное обеспечение в настоящее время поддерживает Windows и Linux. Я использую Microsoft Visual Studio, а также GCC для его создания.

в целом, какие изменения необходимы, если таковые имеются?

4 ответов


старый C++ будет работать с компилятором C++11

  • обзор того, как вы используете итераторы (возможно, вы можете перейти к range-for)
  • обзор, Если вы используете указатель функции (возможно, вы можете использовать lamdaes)
  • обзор инициаторов класса (возможно, вы можете написать список инициализации)
  • просмотрите использование указателя (возможно, вы можете переключиться на SmartPtr)
  • просмотрите свое использование в NULL с указателем, возможно, вы можете перейти к nullptr

проблемы компилятора немногочисленны и просты в работе. Это намного проще, чем принять новый компилятор. Если у вас есть выбор, придерживайтесь std lib, который вы используете сейчас, а затем обновите std lib после компиляции программ как C++11. При динамической загрузке может потребоваться придерживаться более старых версий библиотеки.

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


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

Я думаю, вы действительно имели в виду вопрос о рефакторинге существующего кода, чтобы забрать функции C++11. Здесь я бы применил общую мудрость о рефакторинге - никогда не делайте этого без надлежащей цели и мотивации, основанной на ценности.

только что появились новые блестящие функции, которые не накладывают технологический долг на ваш код.

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

из новых функций, на чем я бы сосредоточился:

  • "авто". Весь мой новый код заполнен. из auto const и auto const& местные жители опуская видах. Хорошо, один предложил globalreplace, противоречащий тому, что я сказал ранее: replace ::iterator usage by auto, если у вас есть для циклов, использующих их.
  • lambdas, если вы используете algos с одноразовыми функциями
  • новый материал резьбы, особенно std::future Если применяется к проекту

Если вы используете 'std:: auto_ptr', вероятно, хороший кандидат на globalreplace.

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


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

какие критические изменения вводятся в C++11?

Если вы планируете изменить свой старый код для использования функций C++11, я бы добавил auto до багет-это.