__declspecとは何ですか、いつ使用する必要がありますか?


157

私が__declspec読んでいるコード内のインスタンスを見てきました。それは何ですか?そして、いつこの構造を使用する必要がありますか?


1
LinuxからWindowsに移行して運が悪かった場合__declspec(dllexport)、ライブラリの各関数の前に追加する必要があることがわかるまで、DLLが機能しない理由を理解するために時間を浪費する可能性があります
SomethingSomething

回答:


74

これは、C ++言語に対するMicrosoft固有の拡張機能であり、ストレージクラス情報を使用して型または関数を属性化できます。

ドキュメンテーション

__declspec(C ++)


19
ありがとう-しかし、私はそれを何に使うでしょうか?
スコットJ

4
たとえば、COMインターフェイスとクラスを宣言する場合は__declspec(uuid)を使用し、関数をエクスポートする場合はDEFファイルを使用せず、__ declspec(dllexport)を使用します。完全なリストは非常に長くなります。
Seva Alekseyev、2010

1
@ScottJ私は常にプロパティに使用します:__declspec(property(get = X put = X))データ型識別子。MSDNにはさらに詳細があります。「C#からC / C ++へのプログラマー」としては至福です。
MasterMastic 2012

51

正規の例は__declspec(dllimport)and __declspec(dllexport)であり、DLLとの間でシンボルを(それぞれ)インポートおよびエクスポートするようリンカーに指示します。

// header
__declspec(dllimport) void foo();


// code - this calls foo() somewhere in a DLL
foo();

__declspec(..)Microsoft固有のものをラップするだけです-互換性を実現するために、通常はマクロでラップします)


8
@tetris、コードからはわかりません。決定はリンカによって行われます。リンカ.libは、一致するエクスポートされたシンボルを持つ最初のリンカを選択します。
Euro Micelli 2013年

19

これは主に、共有ライブラリ(DLL)からシンボルをインポート/エクスポートするために使用されます。Visual C ++コンパイラとGCCコンパイラの両方がおよびをサポート__declspec(dllimport)してい__declspec(dllexport)ます。その他の用途(一部のMicrosoftのみ)は、MSDNに記載されています


12

__declspecキーワードを説明する別の例:

Windowsカーネルドライバーを作成しているときに、インラインアセンブラーコードを使用して独自のプロローグ/エピローグコードシーケンス記述したい場合があるため、ネイキッド属性で関数を宣言できます。

__declspec( naked ) int func( formal_parameters ) {}

または

#define Naked __declspec( naked )
Naked int func( formal_parameters ) {}

ネイキッド(C ++)を参照してください


8

基本的に、これは、標準のC ++の将来の拡張機能と競合しないようにMicrosoftがC ++拡張機能を導入する方法です。__declspecを使用すると、関数またはクラスに属性を付けることができます。正確な意味は、__ declspecの性質によって異なります。たとえば、__ declspec(naked)は、プロローグ/エピローグの生成を抑制し(割り込みハンドラー、埋め込み可能コードなど)、__ declspec(thread)は変数をスレッドローカルにします。

__declspec属性の完全なリストはMSDNで入手でき、コンパイラのバージョンとプラットフォームによって異なります。


1
以下のようなMicrosoft以外のコンパイラを考えるとGCC 4.2自分に加えて、その提供の代替、__attribute__ ((dllexport))にし__declspec(dllexport)、それが呼び出しに公平である__declspec、マイクロソフトのみの延長?
user2338150 2017

0

8年経っていることは知っていますが、MRubyにあるこのコードを共有__declspec()して、と同じレベルでbee をどのように使用できるかを説明したいと思いますexport keyword

/** Declare a public MRuby API function. */
#if defined(MRB_BUILD_AS_DLL)
#if defined(MRB_CORE) || defined(MRB_LIB)
# define MRB_API __declspec(dllexport)
#else
# define MRB_API __declspec(dllimport)
#endif
#else
# define MRB_API extern
#endif
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.