2016-01-07 2 views
42

Есть уже два компиляторы, которые поддерживают модули C++:Как я должен писать свой C++ для подготовки модулей C++?

При запуске нового проекта в настоящее время, что я должен обратить внимание, чтобы чтобы иметь возможность использовать функцию модулей, когда она в конечном итоге выпущена в моем компиляторе?

Возможно ли использовать модули и поддерживать совместимость со старыми компиляторами, которые не поддерживают его?

+3

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

+2

@NECIPS SO - это база знаний, вы не отвечаете мне, а «на мир». Если кто-то задал мне этот вопрос лично, я бы сказал: «Пойдите, напишите тестовый проект, поиграйте с ним и выясните это сами». Несколько лет назад кто-то это сделал и написал об этом в блоге. Теперь я надеюсь, что кто-то напишет SO-ответ. – user7610

+0

Возможно, «Вальдо» может ответить на ваш вопрос (http://theres-waldo.ca/2014/07/17/trip-report-c-standards-committee-meeting-in-rapperswil-june-2014/) –

ответ

19

Есть уже два компиляторы, которые поддерживают модули 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 в настоящее время ожидается реализовать модули, вы должны убедиться, что ваша библиотека может использоваться во всех этих формах:

  1. Динамические библиотеки
  2. Статическая библиотека
  3. Библиотека только для заголовков

Что-то очень удивительное для многих людей, так это то, что модули 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++ в следующем году или году после:

2

Возможно ли использовать модули и поддерживать совместимость со старыми компиляторами, которые не поддерживают его?

Нет, это невозможно. Можно было бы использовать некоторые #ifdef магии, как это:

#ifdef CXX17_MODULES 
    ... 
#else 
    #pragma once, #include "..." etc. 
#endif 

, но это означает, что вам все еще нужно, чтобы обеспечить поддержку .h и тем самым потерять все преимущества, плюс ваш кодовый выглядит некрасиво прямо сейчас.

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

При запуске нового проекта, на что я должен обратить внимание, чтобы иметь возможность использовать функцию модулей, когда она в конечном итоге выпущена в моем компиляторе?

Это зависит. Если ваш проект является предприятием и вы получаете пищу на тарелке, я бы подождал несколько лет, как только он будет выпущен на конюшнях, чтобы он стал широко адаптированным. С другой стороны, если ваш проект может позволить себе перебор, возможно, использовать модули.

В принципе, это та же история, что и Python3 и Python2, или, что менее важно, PHP7 и PHP5. Вы должны найти баланс между хорошим программистом уточненный и не раздражает людей на Debian ;-)

+1

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

+0

Я согласен с тем, что нам нужно подождать некоторое время, прежде чем оно станет пригодным для использования. Я говорю, что 2025 он будет стандартным для использования. Главной проблемой будут медленные составленные компиляторы от Oracle, IBM и Intel. Oracle по-прежнему находится на C++ 11 – Lothar

Смежные вопросы