に優れた最新のプログラマではなく迷惑な人であることの間のバランスを見つける必要があります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のコンパイラは、現在のモジュールを実装するために期待されている限り、あなたはあなたのライブラリーは、これらの形態のすべてで使用可能であることを確認するべきで:
- ダイナミックライブラリ
- 静的ライブラリ
- ヘッダのみライブラリ
何か非常に驚くべきことは、現在のところ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 + +の会議来年または年後に見ることを期待してください:)
私は2400以上の評判ポイントを持つ人に答えを与えるためにちょっと臆病です... ^^私は自分自身に本当に重要ですすべての私のコードを新しい機能に変更するために、C++の新しいアップグレードがリリースされるたびに書きますか?それは多くの副作用や建築上の変化を引き起こすでしょう...もし私があなたなら私は自分自身のメタ言語を書くことになります(私はより多くの支配権を持っています)。私は自分の言語を移す機能を書いています私のchoiseの他のネイティブのプログラミング言語に。これは、ハードウェアの仮想化の考え方に似ています。 –
@NECIPS SOはナレッジベースであり、あなたは私には答えていませんが、 "世界に"です。もし誰かが私にこの質問を人に尋ねたら、「テスト・プロジェクトを書いて遊んでみて、それを自分のために理解してください」と言うでしょう。数年前、誰かがそれをしてブログ記事を書くだろう。今私は誰かがSOの答えを書くことを望んでいます。 – user7610
多分 "Waldo"があなたの質問に答えることができます(http://theres-waldo.ca/2014/07/17/trip-report-c-standards-committee-meeting-in-rapperswil-june-2014/) –