Подтвердить что ты не робот

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

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

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

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

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

Был достигнут некоторый удивительный прогресс в автоматизации рефакторинга кода с помощью clang, и это хорошо представлено в Дэвиде здесь, здесь, и поэтому он заставил меня думать, что, возможно, там возможность создания определенного автономного инструмента, основанного на этой технологии, которая может эффективно преобразовывать шаблоны кода С++ 11 в соответствующие эквиваленты не С++ 11. Идея здесь заключается в том, что вместо использования этого для автоматического рефакторинга общего назначения (например, код изоляции и рефакторинга, где строки преобразуются в строки C и обратно в строки), мы могли бы использовать это для изоляции использования неподдерживаемых С++ 11 и рефакторинг их в некоторый код, который делает то же самое, но фактически успешно скомпилируется.

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

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

4b9b3361

Ответ 1

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

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