次のようなQtソースコードを見ました。
_class Q_CORE_EXPORT QBasicAtomicInt
{
public:
...
};
_
どの_Q_CORE_EXPORT
_マクロは以下のように定義します:
_define Q_DECL_IMPORT __declspec(dllimport)
_
__declspec(dllimport)
はどういう意味ですか?
___declspec
_ は、ストレージクラス情報を指定できるMicrosoft固有の属性です。
(Nitpicker's Corner:ただし、他の多くのコンパイラベンダー(GCCなど)は、Microsoftのコンパイラを対象に記述されたインストール済みのコードベースとの互換性のために、この言語拡張機能をサポートしています。
指定できるストレージクラス属性の2つは、dllimport
とdllexport
です。これらは、関数またはオブジェクトが(それぞれ)DLLからインポートまたはエクスポートされることをコンパイラーに示します。
より具体的には、モジュール定義(_.DEF
_)ファイルを必要とせずに、クライアントへのDLLのインターフェースを定義します。ほとんどの人は、DEFファイルを作成するよりもこれらの言語拡張機能を使用する方がはるかに簡単だと感じています。
明らかな理由により、__declspec(dllimport)
と__declspec(dllexport)
は通常、互いにペアになっています。 dllexport
を使用して、DLLからエクスポートされたシンボルをマークし、dllimport
を使用して、エクスポートされたシンボルを別のファイルにインポートします。
このため、およびDLLをコンパイルするときと、DLLのインターフェイスを使用するクライアントコードの両方で同じヘッダーファイルが通常使用されるため、自動的に解決されるマクロを定義するのが一般的なパターンです。コンパイル時の適切な属性指定子例:
_#if COMPILING_DLL
#define DLLEXPORT __declspec(dllexport)
#else
#define DLLEXPORT __declspec(dllimport)
#endif
_
そして、DLLEXPORT
でエクスポートされるすべてのシンボルにマークを付けます。
おそらく、それは_Q_CORE_EXPORT
_マクロが行うことであり、_Q_DECL_IMPORT
_または_Q_DECL_EXPORT
_のいずれかに解決されます。
__declspec(dllimport)
は、関数、オブジェクト、またはデータ型が外部DLLで定義されていることをコンパイラに伝えるストレージクラス指定子です。
関数、オブジェクト、またはデータ型は、対応する__declspec(dllexport)
とともにDLL)からエクスポートされます。
これは、関数の定義が動的ライブラリにあることを意味します。詳細と例については、 ドキュメント を参照してください。