---
title: "__declspec"
ms.date: "03/21/2019"
f1_keywords: ["__declspec_cpp", "__declspec", "_declspec"]
helpviewer_keywords: ["__declspec keyword [C++]"]
---
# __declspec
**Microsoft Specific**
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. Examples of other storage-class modifiers include the **static** and **extern** keywords. 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. The extended attribute syntax simplifies and standardizes Microsoft-specific extensions to the C and C++ languages.
## Grammar
*decl-specifier*:
**__declspec (** *extended-decl-modifier-seq* **)**
*extended-decl-modifier-seq*:
*extended-decl-modifier*opt
*extended-decl-modifier* *extended-decl-modifier-seq*
*extended-decl-modifier*:
**align(** *#* **)**
**allocate("** *segname* **")**
**allocator**
**appdomain**
**code_seg("** *segname* **")**
**deprecated**
**dllimport**
**dllexport**
**jitintrinsic**
**naked**
**noalias**
**noinline**
**noreturn**
**nothrow**
**novtable**
**process**
**property(** { **get=**_get_func_name_ | **,put=**_put_func_name_ } **)**
**restrict**
**safebuffers**
**selectany**
**spectre(nomitigation)**
**thread**
**uuid("** *ComObjectGUID* **")**
White space separates the declaration modifier sequence. Examples appear in later sections.
Extended attribute grammar supports these Microsoft-specific storage-class attributes: [align](../cpp/align-cpp.md), [allocate](../cpp/allocate.md), [allocator](../cpp/allocator.md), [appdomain](../cpp/appdomain.md), [code_seg](../cpp/code-seg-declspec.md), [deprecated](../cpp/deprecated-cpp.md), [dllexport](../cpp/dllexport-dllimport.md), [dllimport](../cpp/dllexport-dllimport.md), [jitintrinsic](../cpp/jitintrinsic.md), [naked](../cpp/naked-cpp.md), [noalias](../cpp/noalias.md), [noinline](../cpp/noinline.md), [noreturn](../cpp/noreturn.md), [nothrow](../cpp/nothrow-cpp.md), [novtable](../cpp/novtable.md), [process](../cpp/process.md), [restrict](../cpp/restrict.md), [safebuffers](../cpp/safebuffers.md), [selectany](../cpp/selectany.md), [spectre](../cpp/spectre.md), and [thread](../cpp/thread.md). It also supports these COM-object attributes: [property](../cpp/property-cpp.md) and [uuid](../cpp/uuid-cpp.md).
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. The **thread** attribute affects data and objects only. The **naked** and **spectre** attributes affect functions only. The **dllimport** and **dllexport** attributes affect functions, data, and objects. The **property**, **selectany**, and **uuid** attributes affect COM objects.
For compatibility with previous versions, **_declspec** is a synonym for **__declspec** unless compiler option [/Za \(Disable language extensions)](../build/reference/za-ze-disable-language-extensions.md) is specified.
The **__declspec** keywords should be placed at the beginning of a simple declaration. The compiler ignores, without warning, any **__declspec** keywords placed after * or & and in front of the variable identifier in a declaration.
A **__declspec** attribute specified in the beginning of a user-defined type declaration applies to the variable of that type. For example:
```cpp
__declspec(dllimport) class X {} varX;
```
In this case, the attribute applies to `varX`. A **__declspec** attribute placed after the **class** or **struct** keyword applies to the user-defined type. For example:
```cpp
class __declspec(dllimport) X {};
```
In this case, the attribute applies to `X`.
The general guideline for using the **__declspec** attribute for simple declarations is as follows:
*decl-specifier-seq* *init-declarator-list*;
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:
```cpp
__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:
```cpp
// Example of the __declspec keyword
__declspec( thread ) int tls_i = 1;
```
**END Microsoft Specific**
## See also
[Keywords](../cpp/keywords-cpp.md)
[C Extended Storage-Class Attributes](../c-language/c-extended-storage-class-attributes.md)