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

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

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

Другой полубетонный пример, один из моих недавних проектов, заключался в создании инструмента сравнения для передового использования в разработке; Я был недоволен традиционными различиями на основе строк, поэтому я создал небольшой инструмент командной строки, который использует diff_match_patch реализация в C ++. C ++ 11 «проник» в клейкий код, потому что auto это слишком круто, но в результате мне пришлось пойти и собрать LLVM, Clang и libc ++ для Linux, чтобы начать использовать мой инструмент в Linux. Не совсем понятно, как даже распространять проекты C ++ 11 в Linux в виде исходного кода, потому что это немного сложная задача — настроить Clang в Linux. Это не значит, что этого нельзя сделать, но это просто слишком круто, и нужно потратить несколько часов, чтобы установить там этот набор инструментов. (Обновить: Ну, через несколько месяцев / лет этот же маленький инструмент теперь прекрасно работает с GCC, предоставляемым пакетами centos 7, так что это облегчение.)

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

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

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

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

11

Решение

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

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

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]