__declspec

Microsoft 固有の仕様Microsoft Specific

ストレージクラス情報を指定するための拡張属性構文では、キーワードを使用します __declspec 。これは、指定された型のインスタンスが、次に示す Microsoft 固有のストレージクラス属性を使用して格納されることを指定します。The extended attribute syntax for specifying storage-class information uses the __declspec keyword, which specifies that an instance of a given type is to be stored with a Microsoft-specific storage-class attribute listed below. その他のストレージクラス修飾子の例 static として、キーワードとキーワードがあり extern ます。Examples of other storage-class modifiers include the static and extern keywords. ただし、これらのキーワードは C および C++ 言語の ANSI 仕様の一部であるため、拡張属性構文では扱われません。However, these keywords are part of the ANSI specification of the C and C++ languages, and as such are not covered by extended attribute syntax. 拡張属性構文は、Microsoft 固有の C および C++ 言語拡張を簡略化し、標準化します。The extended attribute syntax simplifies and standardizes Microsoft-specific extensions to the C and C++ languages.

文法Grammar

decl-specifier:decl-specifier:
    __declspec ( extended-decl-modifier-seq )    __declspec ( extended-decl-modifier-seq )

extended-decl-modifier-seq:extended-decl-modifier-seq:
     extended-decl-modifier opt    extended-decl-modifieropt
    extended-decl-modifier extended-decl-modifier-seq    extended-decl-modifier extended-decl-modifier-seq

extended-decl-modifier:extended-decl-modifier:
    align(番号)    align( number )
    allocate("segname")    allocate(" segname ")
    allocator    allocator
    appdomain    appdomain
    code_seg("segname")    code_seg(" segname ")
    deprecated    deprecated
    dllimport    dllimport
    dllexport    dllexport
    jitintrinsic    jitintrinsic
    naked    naked
    noalias    noalias
    noinline    noinline
    noreturn    noreturn
    nothrow    nothrow
    novtable    novtable
    process    process
    property({ get= get-func-name | ,put= put-name })    property( { get=get-func-name | ,put=put-func-name } )
    restrict    restrict
    safebuffers    safebuffers
    selectany    selectany
    spectre(nomitigation)    spectre(nomitigation)
    thread    thread
    uuid("Comobjectguid")    uuid(" ComObjectGUID ")

空白は、宣言修飾子のシーケンスを区切ります。White space separates the declaration modifier sequence. その例は以降のセクションで示します。Examples appear in later sections.

拡張属性の文法では、Microsoft 固有のストレージクラス属性である、、、、、、、、、、、、、、、、、、、、およびがサポートさ align allocate allocator appdomain code_seg deprecated dllexport dllimport jitintrinsic naked noalias noinline noreturn nothrow novtable process restrict safebuffers selectany spectre れてい thread ます。Extended attribute grammar supports these Microsoft-specific storage-class attributes: align, allocate, allocator, appdomain, code_seg, deprecated, dllexport, dllimport, jitintrinsic, naked, noalias, noinline, noreturn, nothrow, novtable, process, restrict, safebuffers, selectany, spectre, and thread. また、これらの COM オブジェクト属性 (および) もサポートしてい property uuid ます。It also supports these COM-object attributes: property and uuid.

、、、、、、、、、、 code_seg dllexport およびの dllimport naked noalias nothrow property restrict selectany thread uuid 各ストレージクラス属性は、適用先のオブジェクトまたは関数の宣言のプロパティにすぎません。The code_seg, dllexport, dllimport, naked, noalias, nothrow, property, restrict, selectany, thread, and uuid storage-class attributes are properties only of the declaration of the object or function to which they are applied. 属性は、 thread データとオブジェクトにのみ影響します。The thread attribute affects data and objects only. naked 属性と spectre 属性は、関数にのみ影響します。The naked and spectre attributes affect functions only. dllimport 属性と dllexport 属性は、関数、データ、およびオブジェクトに影響します。The dllimport and dllexport attributes affect functions, data, and objects. property、、およびの各属性は、 selectany uuid COM オブジェクトに影響を与えます。The property, selectany, and uuid attributes affect COM objects.

以前のバージョンとの互換性を維持するために、 _declspec __declspec コンパイラオプションの [ ( 言語拡張を無効にする] が指定されていない限り、はのシノニムになります。For compatibility with previous versions, _declspec is a synonym for __declspec unless compiler option /Za (Disable language extensions) is specified.

キーワードは、 __declspec 単純な宣言の先頭に配置する必要があります。The __declspec keywords should be placed at the beginning of a simple declaration. コンパイラは警告なしで、 __declspec * または & の後に配置されたキーワードを無視し、宣言の変数識別子の前に配置します。The compiler ignores, without warning, any __declspec keywords placed after * or & and in front of the variable identifier in a declaration.

__declspec ユーザー定義型の宣言の先頭に指定された属性は、その型の変数に適用されます。A __declspec attribute specified in the beginning of a user-defined type declaration applies to the variable of that type. 次に例を示します。For example:

__declspec(dllimport) class X {} varX;

この場合、属性は varX に適用されます。In this case, the attribute applies to varX. __declspec またはキーワードの後に配置された属性は、 class struct ユーザー定義型に適用されます。A __declspec attribute placed after the class or struct keyword applies to the user-defined type. 次に例を示します。For example:

class __declspec(dllimport) X {};

この場合、属性は X に適用されます。In this case, the attribute applies to X.

単純な宣言に属性を使用するための一般的なガイドラインは次のとおり __declspec です。The general guideline for using the __declspec attribute for simple declarations is as follows:

宣言子-seq init-宣言子リストdecl-specifier-seq init-declarator-list;

宣言指定子-seqには、特に基本型 (、、、 int float typedef またはクラス名)、ストレージクラス (など static )、 extern または __declspec 拡張機能を含める必要があります。The decl-specifier-seq should contain, among other things, a base type (e.g. int, float, a typedef, or a class name), a storage class (e.g. static, extern), or the __declspec extension. 初期化子リストには、特に、宣言のポインター部分が含まれている必要があります。The init-declarator-list should contain, among other things, the pointer part of declarations. 次に例を示します。For example:

__declspec(selectany) int * pi1 = 0;   //Recommended, selectany & int both part of decl-specifier
int __declspec(selectany) * pi2 = 0;   //OK, selectany & int both part of decl-specifier
int * __declspec(selectany) pi3 = 0;   //ERROR, selectany is not part of a declarator

次のコードでは、整数型のスレッド ローカル変数を宣言して特定の値に初期化します。The following code declares an integer thread local variable and initializes it with a value:

// Example of the __declspec keyword
__declspec( thread ) int tls_i = 1;

Microsoft 固有の仕様はここまでEND Microsoft Specific

関連項目See also

キーワードKeywords
C 拡張ストレージ クラス属性C Extended Storage-Class Attributes