Есть уже два компиляторы, которые поддерживают модули C++
лязг: http://clang.llvm.org/docs/Modules.html MS VS 2015: http://blogs.msdn.com/b/vcblog/archive/2015/12/03/c-modules-in-vs-2015-update-1.aspx
подход Microsoft, кажется, один набирает наибольшее тяговое усилие, в основном потому, что Microsoft бросает намного больше ресурсов на их реализации, чем любой из лязга народа в настоящее время. См. https://llvm.org/bugs/buglist.cgi?list_id=100798&query_format=advanced&component=Modules&product=clang, что я имею в виду, в модулях для C++ есть некоторые большие ошибки showstopper, тогда как модули для C или особенно Objective C выглядят гораздо более полезными в реальном мире. Крупнейший и самый важный клиент Visual Studio, Microsoft, сильно подталкивает модули, потому что он решает целую кучу проблем с масштабированием внутренней сборки, а внутренний код Microsoft - это самый сложный C++ для компиляции в любом месте, поэтому вы не можете выбросить какой-либо компилятор кроме MSVC (например, удачи, получая clang или GCC, чтобы скомпилировать функции линии 40k).Поэтому трюки для сборки clang, используемые Google и т. Д., Не доступны Microsoft, и им громадная насущная потребность в ее исправлении раньше, чем позже.
Это не означает, что в предложении Microsoft нет серьезных недостатков дизайна, когда они применяются на практике для крупных базовых кодов реального мира. Однако Габи считает, что вы должны реорганизовать свой код для модулей, и пока я не согласен, я вижу, откуда он.
При запуске нового проекта, на что я должен обратить внимание, чтобы иметь возможность использовать функцию модулей, когда она в конечном итоге выпущена в моем компиляторе?
Поскольку компилятор от Microsoft в настоящее время ожидается реализовать модули, вы должны убедиться, что ваша библиотека может использоваться во всех этих формах:
- Динамические библиотеки
- Статическая библиотека
- Библиотека только для заголовков
Что-то очень удивительное для многих людей, так это то, что модули C++, которые в настоящее время ожидаются lemented сохраняет эти различия, так что теперь вы получаете вариант C++ Module для всех трех из вышеперечисленного, причем первый из них наиболее похож на то, что люди ожидают от модуля C++, и последний выглядит как более полезный предварительно скомпилированный заголовок. Причина, по которой вы должны поддерживать эти варианты, состоит в том, что вы можете повторно использовать большинство тех же машин препроцессора, чтобы также поддерживать C++-модули с очень небольшой дополнительной работой.
Более поздняя Visual Studio позволит связать файл определения модуля (файл .ifc) в качестве ресурса в DLL. Это, наконец, устранит необходимость в расширении .lib и .dll на MSVC, вы просто поставьте единую DLL компилятору, и все это «просто работает» на импорте модуля, без заголовков или чего-либо еще. Это, конечно, немного пахнет COM, но без большинства преимуществ COM.
Можно ли использовать модули в одном кодовую и по-прежнему поддерживать совместимость со старыми компиляторами, которые не поддерживают его?
Я собираюсь предположить, что вы имели в виду жирный текст, вставленный выше.
Ответ, как правило, да с еще большим количеством препроцессора. #include <someheader>
может превращаться в import someheader
внутри заголовка, потому что препроцессор все еще работает как обычно. Таким образом, можно размечать отдельные библиотечные заголовки с поддержкой модулей C++ вместе что-то вроде этих строк:
// someheader.hpp
#if MODULES_ENABLED
# ifndef EXPORTING_MODULE
import someheader; // Bring in the precompiled module from the database
// Do NOT set NEED_DEFINE so this include exits out doing nothing more
# else
// We are at the generating the module stage, so mark up the namespace for export
# define SOMEHEADER_DECL export
# define NEED_DEFINE
# endif
#else
// Modules are not turned on, so declare everything inline as per the old way
# define SOMEHEADER_DECL
# define NEED_DEFINE
#endif
#ifdef NEED_DEFINE
SOMEHEADER_DECL namespace someheader
{
// usual classes and decls here
}
#endif
Теперь в вашем main.cpp или что-то, вы просто сделать:
#include "someheader.hpp"
... и если у компилятора были/экспериментальные: modules/DMODULES_ENABLED, тогда ваше приложение автоматически использует версию C++ Modules вашей библиотеки. Если это не так, вы получаете встроенное включение, как мы всегда делали.
Я считаю, что это минимально возможный набор изменений в исходный код, чтобы сделать код уже готовым.Вы заметите, что я ничего не сказал о сборке систем, это потому, что я все еще отлаживаю инструмент cmake, который я написал, чтобы получить все это, чтобы «просто работать», и я ожидаю отладки его еще несколько месяцев. Ожидайте увидеть его, возможно, на конференции C++ в следующем году или году после:
Я немного задушил, чтобы дать ответ человеку с более чем 2400 точками репутации ... ^^ Я спрашиваю себя, действительно ли это важно писать каждый раз, когда выдается новое обновление C++, чтобы изменить весь мой код на новые функции? Это вызовет много побочных эффектов или архитектурных изменений ... Если бы я был вами, я бы написал свой собственный метаязык, который был бы постоянным (или где у меня больше контроля), и я бы написал функцию для перевода моего языка в любой другой родной язык программирования по моему выбору. Это похоже на идею виртуализации оборудования. –
@NECIPS SO - это база знаний, вы не отвечаете мне, а «на мир». Если кто-то задал мне этот вопрос лично, я бы сказал: «Пойдите, напишите тестовый проект, поиграйте с ним и выясните это сами». Несколько лет назад кто-то это сделал и написал об этом в блоге. Теперь я надеюсь, что кто-то напишет SO-ответ. – user7610
Возможно, «Вальдо» может ответить на ваш вопрос (http://theres-waldo.ca/2014/07/17/trip-report-c-standards-committee-meeting-in-rapperswil-june-2014/) –