2013-07-04 5 views
11

Это имеет значение для переносимости кода кода C++ 11 в целом. Я говорю о том, что новый этап генерации кода похож на этап препроцессора C/C++, в котором мы можем сделать сгенерированный код на C++ более «дружественным» к большому семейству компиляторов. Я подумал, что, возможно, это потенциально может повлиять на то, насколько возможно переносить людей на кодирование в C++ 11.Есть ли способ преобразовать код C++ 11 в код C++, который может быть скомпилирован менее способным компилятором?

Игровые консоли являются примером платформы, где вы можете зависеть от ограничивающего компилятора, который, возможно, может не поддерживать хорошие возможности C++ 11. Другим примером может быть Intel's C++ compiler. Я очень рад видеть, что Intel уже работает над этим и, похоже, это не вопросом о последней версии, но предположу, что для некоторых причины Требовалась использовать старую версию компилятора!

Еще один пример из полубетона - один из моих последних проектов, заключался в том, чтобы создать инструмент diff для использования на переднем крае в разработке; Я стал недоволен традиционными линейными различиями, поэтому я создал небольшой инструмент командной строки, который использует реализацию diff_match_patch на C++. C++ 11 «проникает» в код клея, потому что auto просто слишком крут, но последствием было то, что мне в основном приходилось строить LLVM, Clang и libC++ в Linux, чтобы начать использовать мой инструмент для Linux. Не совсем понятно, как даже распространять проекты на C++ 11 в Linux в исходной форме, потому что это немного сложное испытание для установки в Linux. Это не значит, что это невозможно сделать, но это просто слишком кровоточащий край, и нужно потратить несколько часов, чтобы установить эту инструментальную цепочку. (Update: Ну, через несколько месяцев/лет спустя, тот же самый маленький инструмент в настоящее время строит прекрасно с GCC, предоставленной CentOS 7 в пакеты, так что это облегчение.)

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

Там было каким-то удивительное прогресс в автоматизации рефакторинга кода с лязгом, и это хорошо представлено в David's answer here, и поэтому он заставил меня думать, что, возможно, есть возможность создания конкретного автономного инструмента основан офф этой технологии, которая может эффективно преобразовывать шаблоны кода C++ 11 в соответствующие не-C++ 11 эквиваленты. Идея здесь заключается в том, что вместо использования этого для автоматического рефакторинга общего назначения (например, код изоляции и рефакторинга, где строки преобразуются в строки C и обратно в строки), мы могли бы использовать это для изоляции использования неподдерживаемых C++ 11 и рефакторинг их в некоторый код, который делает то же самое, но фактически успешно скомпилирует.

Возможно ли это? Я не слишком хорошо разбираюсь в возможностях C++ 11 и о том, какими будут последствия с точки зрения понижающей оценки на «старый» C++, который реализует те же функции. Кажется, что, если это возможно, я не мог этого сделать, потому что у меня нет (и я не ожидаю, что когда-либо) хватит понимания языка, чтобы знать, как это реализовать.

Я полагаю, что более подходящий вопрос будет, это стоит усилий? Трудно понять, как (учитывая, что LLVM явно очень способен при кросс-компиляции в ARM), можно было бы избежать использования clang для выполнения этой работы с использованием более прямых методов, таких как кросс-компиляция в целевую paltform. Я предполагаю, что это просто моя паранойя, и мне не нужно будет беспокоиться в будущем о том, чтобы мой код на C++ 11 работал плавно на всех возможных целевых платформах, так как они должны все быть либо x86, x86-64 , или ARM в любом случае. Но кто знает, какая моя работа будет через несколько лет.

+2

Возможный дубликат [Есть ли конвертер C++ 11 в C++ 03?] (Http://stackoverflow.com/questions/14762078/is-there-a-c11-to-c03-converter) – Ali

+0

Ах, черт возьми, действительно, вопрос уже задан. –

+1

Вместо преобразования кода посмотрите на нечто вроде 'boost.config', которое будет обрабатывать различия в компиляторах. –

ответ

2

Кроме того, g++ в течение многих лет поддерживал все более значительную часть C++ 11. 4.8.1 имеет довольно полную поддержку, в соответствии с http://gcc.gnu.org/projects/cxx0x.html, и большинство наиболее интересных частей были доступны гораздо дольше (например, auto, а вариационные шаблоны в 4.4, пользовательские строковые литералы в 4.5 и constexprs в 4.6).

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

+0

Очень удобный вариант. –