Директива связывания extern "N" для стандартов

Александр Коновалов
Александр Коновалов

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

У языка C++ есть старая "болезнь" (но для некоторых и приятная особенность): очень сильная обратная совместимость. Она ограничивает или усложняет введение нового функционала. Для хотя бы частичного решения данной проблемы есть идея указывать используемый стандарт в директиве extern (например: extern "c++11" { ... }). Таким образом, старый код можно будет обернуть данной директивой, не боясь проблем обратной совместимости. В рамках данной идеи также предлагается пропускать конструкции с невалидной строкой (а скорее даже выводить warning).

Чем хороша для этого extern? Во-первых, такой подход используется для включения C кода в C++, а также аналогичный для использования C++ и C в D. Во-вторых, есть уже готовая и проверенная языковая конструкция. В-третьих, такую конструкцию также можно использовать для кастомных расширений C++ какими-либо компиляторами (а может даже библиотеками, которые ставятся как плагины к компиляторам).

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

3
рейтинг
4 комментария
Antervis

extern тоже одна старая болезнь с++

Antervis
Александр Коновалов

Antervis, он действительно выглядит как болезнь, но при этом мне осталось не понятно, зачем эту болезнь (если это всё же болезнь) потащили в D?

Александр Коновалов
Andrey Davydov

Есть идея (очень неоднозначная) иметь разные диалекты языка в разных модулях. Одна из дискуссий, к примеру, тут: https://www.reddit.com/r/cpp/comments/agcw7d/c_modules_a_chance_to_clean_up_the_language/. Может быть такого рода решение удолетворит Вас?

Andrey Davydov
Александр Коновалов

Andrey Davydov, да, по сути то же, что и я предлагаю, только на основе модулей. По факту, в моём предложении механизм не самое главное.

Александр Коновалов
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).
Все предложения