今、私は自分が書いたものではない古いコードを分析します。ヘッダーには、次のような多くの宣言があります。
SVPDSDKDLLEXPORT inline C3vec mult(C3vec src, D3DXMATRIX &m);
SVPDSDKで使用される場合、SVPDSDKDLLEXPORTは_declspec(dllexport)として定義されます。SVPDSDK.dllを使用するプロジェクトで使用される場合は、_declspec(dllimport)として。ヘッダーに定義がなく、.cppファイルにあるため、ここでのインライン化は非常に奇妙に思えますが、SVPDSDKとそれぞれのDLLを使用するすべてのプロジェクトのコンパイルとリンクは問題なく実行されます。無視され、インライン化されていないかのように関数がエクスポートされると思います。
私はこの議論を見つけました: C ++:dllimport / dllexportを使用したインライン関数?
そのようなすべての宣言から「インライン」を削除する必要があるように見えました。インライン化とエクスポート/インポートを混在させないでください。しかし、MSDNでこのトピックを見つけました:http: //msdn.microsoft.com/en-us/library/xa0d9ste
私はそれのいくつかの部分を理解していません。
dllexport属性を使用して関数をインラインとして定義できます。この場合、プログラム内のモジュールが関数を参照しているかどうかに関係なく、関数は常にインスタンス化されてエクスポートされます。この関数は、別のプログラムによってインポートされたものと見なされます。
まず、「関数は常にインスタンス化される」とはどういう意味ですか?C ++でのテンプレート関数のインスタンス化に関するトピックのみが見つかり、他のインスタンス化は見つかりませんでした。テンプレートとのみ接続されていますか?
次に、「関数は常にエクスポートされます」。全くわかりません。declspec(_dllexport)を使用した関数がエクスポートされない場合がありますか?どのような場合ですか?
インポートについて:
dllimport属性で宣言された関数をインラインとして定義することもできます。この場合、関数は拡張できますが(/ Ob仕様に従う)、インスタンス化されることはありません。特に、インラインインポートされた関数のアドレスが取得されると、DLLに存在する関数のアドレスが返されます。この動作は、インラインでインポートされていない関数のアドレスを取得するのと同じです。
繰り返しますが、この場合のインスタンス化の意味はわかりません。
この質問を書き、MSDNのトピックを分析しているときに、エクスポート/インポートと同時にインライン化される関数は、プロジェクト自体(私の場合はSVPDSDK)でのみインライン化され、すべてでインライン化されないという結論に達しました。プロジェクトのインポート。これは、MSDNトピックで明らかに宣言されていません。それを使用するプロジェクトにインポートせず、ヘッダーファイルに定義がない場合、通常のインライン関数になるため、リンケージエラーが発生します。それから、インライン化とエクスポート/インポートを混合することは、上記のスタックオーバーフローの議論の答えと矛盾すると考えて、同意できるように思えます。私は正しいですか?
そして、インライン関数のインスタンス化に関するこのすべての言葉をまだ理解していません。
申し訳ありませんが、いくつかの質問を1つのトピックにまとめましたが、同じ問題と同じ資料で統合されているため、どのように別々の質問に分割するかはわかりません。しかし、誰かが私のためにこの質問を明確にすることができれば、私は感謝します。