99

私はこのようなQtソースコードを見ました:

class Q_CORE_EXPORT QBasicAtomicInt
{
public:
...
};

Q_CORE_EXPORT以下のように定義するマクロ:

define Q_DECL_IMPORT __declspec(dllimport)

では、__declspec(dllimport)実際にはどういう意味ですか?

4

4 に答える 4

135

__declspecストレージクラス情報を指定できるMicrosoft固有の属性です。
(Nitpicker's Corner:ただし、GCCなどの他の多くのコンパイラベンダーは、Microsoftのコンパイラを対象として作成されたコードのインストールベースとの互換性のために、この言語拡張をサポートしています。一部のベンダーは、追加のストレージクラス属性を提供しています。)

指定できるストレージクラス属性の2つはとdllimportですdllexport。これらは、関数またはオブジェクトがDLLから(それぞれ)インポートまたはエクスポートされることをコンパイラーに示します。

具体的には、module-definition(.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

于 2012-01-14T15:38:51.830 に答える
31

__declspec(dllimport)関数、オブジェクト、またはデータ型が外部 DLL で定義されていることをコンパイラに伝えるストレージ クラス指定子です。

関数、オブジェクト、またはデータ型は、対応する DLL からエクスポートされます__declspec(dllexport)

于 2012-01-14T15:39:46.800 に答える
-3

これは、関数の定義がダイナミックライブラリにあることを意味します。詳細と例については、ドキュメントを参照してください。

于 2012-01-14T15:37:41.253 に答える