モジュールに対する C++1z の提案について学んでいます。私の最大の希望は、 Windowsでのdllimport
,の使用に取って代わることです。c++1z モジュールを使用すると、windows およびLinux でdllexport
ビルドできますか? すべてのプラットフォームとコンパイラで必要なのはモジュールだけですか?.dll
.so
dllimport/dllexport
export
3 に答える
残念だけど違う。
C++ でのモジュールの提案では、ヘッダーを含むコードで特に問題となるヘッダーの欠点に対処しようとしています。
テンプレートは通常、完全にヘッダーに実装されますが、これは、テンプレートのコンテンツが、そのヘッダーが含まれる前に発生するプリプロセッサ定義の対象になることを意味します。
たとえば、テンプレートがi
識別子として を使用し、#define i 2
テンプレートのヘッダーの前に次のようなヘッダーが含まれている場合、コードは次のように開始できます。
for (int i=0; i<10 ; i++)
...しかし、プリプロセッサが完了すると、次のようになります。
for (int 2=0; 2<20; 2++)
...そして、それは明らかにまったくコンパイルされません。
モジュールはこれを修正します。モジュールは、ヘッダーにあるのではなく、個別にコンパイルされます。モジュールは独立してコンパイルされるため、ソース コードに他のヘッダーが含まれていない限り、モジュールは他のヘッダーの影響を受けません。
同様に、ヘッダーで作成されたプリプロセッサ定義は、モジュールをインポートするコードに影響を与えることはできません。そのモジュールをインポートするファイルで表示されるようになるモジュール内の唯一の名前は、モジュールから明示的にエクスポートされた名前です。
dllexport は引き続き必要ですが、dllimport はおそらく自動的に行われます。少なくともVS 2015 Update 1 の C++ モジュールでは、1 つのコメントで次のように述べています。
アンドリュー・パードー [MSFT]
@Matthias: プログラマーは、DLL 境界でエクスポートされるシンボルに対して __declspec(dllexport) と言うだけで済みます。__declspec(dllimport) は、モジュールを使用するときにコンパイラによって処理されます。
残念ながら、これ以上信頼できる情報は見つかりませんでした。