2016-06-27 6 views
1

私はC++ 1zのモジュールの提案について学んでいます。私の最大の希望は、Windows上でdllimport,dllexportの使用を置き換えることです。 C++ 1zモジュールを使用すると、Windows上で.dllをビルドでき、dllimport/dllexportの使用を避けるためにLinux上で.soをビルドできるようになりますか?モジュールexportは、すべてのプラットフォームとコンパイラで必要とされることでしょうか?Windowsのdllimport dllexportの代わりにC++ 1zモジュールを使用する

+1

C++ 1zにはモジュールがありません。 –

+0

私は標準の専門家ではありません。その情報はどこにありますか? – Nick

+1

どちらの情報ですか? –

答えて

4

残念ながら、

C++でのモジュールの提案は、ヘッダーの欠点に対処しようとしていますが、ヘッダーを含むコードでは特に問題になります。

テンプレートは通常、完全にヘッダーに実装されますが、テンプレートの内容は、そのヘッダーがインクルードされる前に発生するプリプロセッサ定義の対象となります。例えば

テンプレートは識別子としてiを使用し、#define i 2のようなものを持つヘッダがテンプレートのヘッダの前に含まれることを起こる場合は、あなたのコードは次のように出始めることができ:

for (int i=0; i<10 ; i++) 

...プリプロセッサを実行すると、次のようになります。

for (int 2=0; 2<20; 2++) 

...明らかにコンパイルされません。

モジュールがこれを修正します。モジュールは、ヘッダの代わりに独立してコンパイルされます。独立してコンパイルされるので、ソースコードにこれらのヘッダーが含まれていない限り、モジュールは他のヘッダーの影響を受けません。

同様に、ヘッダー内に作成されたプリプロセッサ定義は、モジュールをインポートするコードに影響を与えることはできません。そのモジュールをインポートするファイルに表示されるモジュール内の唯一の名前は、モジュールから明示的にエクスポートされた名前です。

2

dllexportはまだ必要ですが、dllimportはおそらく自動的になります。少なくともC++ Modules in VS 2015 Update 1に、彼らは1つのコメントでそれを言う:

アンドリューPardoe [MSFT]

@Matthias:プログラマが今だけDLL境界でエクスポートされるシンボルを__declspec(DLLEXPORTを)言う必要があります。 __declspec(dllimport)は、モジュールを消費するときにコンパイラによって処理されます。

残念ながら、それについての信頼できる情報はありませんでした。

+0

'.dll'を使うためにモジュールの中でマクロを使う必要はないという希望があります。 – Nick

関連する問題