2016-01-07 3 views
42

C++モジュールをサポートする2つのコンパイラすでにありますC++をどのようにしてC++モジュールの準備をする必要がありますか?

新しいプロジェクトを開始、最終的に私のコンパイラでリリースされたときにモジュール機能を採用できるようにするには?

モジュールを使用することはできますが、それをサポートしていない古いコンパイラとの互換性は維持できますか?

+3

私は2400以上の評判ポイントを持つ人に答えを与えるためにちょっと臆病です... ^^私は自分自身に本当に重要ですすべての私のコードを新しい機能に変更するために、C++の新しいアップグレードがリリースされるたびに書きますか?それは多くの副作用や建築上の変化を引き起こすでしょう...もし私があなたなら私は自分自身のメタ言語を書くことになります(私はより多くの支配権を持っています)。私は自分の言語を移す機能を書いています私のchoiseの他のネイティブのプログラミング言語に。これは、ハードウェアの仮想化の考え方に似ています。 –

+2

@NECIPS SOはナレッジベースであり、あなたは私には答えていませんが、 "世界に"です。もし誰かが私にこの質問を人に尋ねたら、「テスト・プロジェクトを書いて遊んでみて、それを自分のために理解してください」と言うでしょう。数年前、誰かがそれをしてブログ記事を書くだろう。今私は誰かがSOの答えを書くことを望んでいます。 – user7610

+0

多分 "Waldo"があなたの質問に答えることができます(http://theres-waldo.ca/2014/07/17/trip-report-c-standards-committee-meeting-in-rapperswil-june-2014/) –

答えて

19

に優れた最新のプログラマではなく迷惑な人であることの間のバランスを見つける必要があります2015:http://blogs.msdn.com/b/vcblog/archive/2015/12/03/c-modules-in-vs-2015-update-1.aspx

マイクロソフトのアプローチには、Microsoftは現在、打ち鳴らす民族のいずれよりも、その実装で、より多くのリソースを投げている主な理由は、最も勢いを増し一つであることが表示されます。私が言っていることは、https://llvm.org/bugs/buglist.cgi?list_id=100798&query_format=advanced&component=Modules&product=clangを参照してください。C++のモジュールには大きなショーストッパーのバグがありますが、Cや特にObjective Cのモジュールは実世界のコードでもっと使いやすくなります。 Visual Studioの最大かつ重要な顧客であるMicrosoftは、内部ビルドのスケーラビリティの問題を全面的に解決するため、Modulesを強く推進しています。マイクロソフト社の内部コードは、存在する場所でコンパイルするのが難しいC++の一部です。それはMSVC以外のものです(例えば、40k回線機能をコンパイルするためにclangやGCCを取得するなど)。そのため、Googleなどで使用されているclangビルドトリックはマイクロソフトからは入手できず、後でなく早く修正する必要があります。

実際に大規模な実世界のコードベースに適用された場合、マイクロソフトの提案に深刻な設計上の欠陥がないことは言うまでもありません。しかし、Gabyはモジュールのコードをリファクタリングする必要があると考えていますが、私は意見が一致しませんが、どこから来ているのか分かります。

現在、新しいプロジェクトを開始するとき、最終的にコンパイラでリリースされるときにモジュール機能を採用するにはどうすればよいですか?

Microsoftのコンパイラは、現在のモジュールを実装するために期待されている限り、あなたはあなたのライブラリーは、これらの形態のすべてで使用可能であることを確認するべきで:

  1. ダイナミックライブラリ
  2. 静的ライブラリ
  3. ヘッダのみライブラリ

何か非常に驚くべきことは、現在のところimpこれらの区別を維持するので、今度はの3つのすべてののC++モジュールの亜種が得られます。最初はC++モジュールが期待するように見え、最後は最も便利なプリコンパイル済みヘッダーのようです。これらのバリエーションをサポートしなければならない理由は、同じプリプロセッサマシンの大半を再利用してC++モジュールをサポートし、余分な作業をほとんど必要としないためです。

後でVisual Studioでモジュール定義ファイル(.ifcファイル)をリソースとしてDLLにリンクすることができます。これにより、MSVC上で.libと.dllの区別が不要になります。コンパイラに単一の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" 

...とあればコンパイラには/ experimental:modules/DMODULES_ENABLEDがあり、アプリケーションはライブラリのC++モジュール版を自動的に使用します。もしそうでなければ、私たちがいつもしてきたようにインラインで取り込むことになります。

これらは、あなたのコードをModules-readyにするためのソースコードの変更の可能な限りのものです。ビルドシステムについては何も言及していないことに注意してください。これは、私が書いたcmakeツールをまだデバッグしていて、すべてのものを「うまく動作させる」ようにしていて、数ヶ月間デバッグすることが期待されるからです。それはおそらくC + +の会議来年または年後に見ることを期待してください:)

2

モジュールを使用しても、それをサポートしていない古いコンパイラとの互換性は維持できますか?

いいえ、できません。それはこのようにいくつかの#ifdef魔法を使用できる場合があります:

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

が、これはあなたがまだ.hサポートを提供し、したがって、すべての利益を失うする必要があることを意味し、プラスあなたのコードベースは今、非常に醜いです。

このアプローチを採用したい場合は、私が作成した "CXX17_MODULES"を検出する最も簡単な方法は、あなたが選んだビルドシステムでモジュールを使用する小さなテストプログラムをコンパイルし、全員にグローバルを定義することですコンパイルが成功したかどうかを確認する。

現在、新しいプロジェクトを開始するとき、最終的にコンパイラでリリースされるときにモジュール機能を採用するにはどうすればよいですか?

によって異なります。あなたのプロジェクトがエンタープライズで、食べ物を食べるなら、それが広く適応されるように、それが厩舎で解放されると数年待つでしょう。一方、あなたのプロジェクトが最先端になることができれば、是非、モジュールを使用してください。

基本的には、Python3とPython2、それと関連性の低いPHP7とPHP5と同じ話です。 http://clang.llvm.org/docs/Modules.html MS VS:あなたはC++モジュールをサポートする2つのコンパイラ

打ち鳴らすが既に存在するDebianの;-)

+1

なぜdownvote?とにかく、C++モジュールは、ユーザ定義リテラルのように、さらに別のクレイジーubercool機能ではなく、本当の問題(C++のコードでモジュール性を発現する)に考え抜かれたソリューション。私のコードがうまく設計されていれば、すでにモジュール化されています。私はちょうど – user7610

+0

は、私たちは、それが使用可能な取得する前に、しばらく待たなければならないことに同意し、それを活用することができるように、ツーリングにそれを通信する必要があります。私は2025年はそれが使用するstandartになると言う。 Oracle、IBM、Intelの遅い開発コンパイラが主な問題になります。オラクルはまだC++ 11 – Lothar

関連する問題