收藏 declspec關鍵字詳細用法

2021-05-26 08:56:28 字數 3121 閱讀 8753

__declspec用於指定所給定型別的例項的與microsoft相關的儲存方式。其它的有關儲存方式的修飾符如static與extern等是c和c++語言的ansi規範,而__declspec是一種擴充套件屬性的定義。擴充套件屬性語法簡化並標準化了c和c++語言關於microsoft的擴充套件。

用法:__declspec ( extended-decl-modifier )

extended-decl-modifier引數如下,可同時出現,中間有空格隔開:

align (c++)

allocate

deprecated (c++)

dllimport

dllexport

jitintrinsic

naked (c++)

noalias

noinline

noreturn

nothrow (c++)

novtable

process

property(c++)

restrict

selectany

thread

uuid(c++)

1.__declspec關鍵字應該出現在簡單宣告的前面。對於出現在*或&後面或者變數宣告中識別符號的前面的__declspec,編譯器將忽略並且不給出警告。

2.要注意區分__declspec是修飾型別還是修飾變數:

__declspec(align(8)) struct str b;修飾的是變數b。其它地方定義的struct str型別的變數將不受__declspec(align(8))影響。

__declspec(align(8)) struct str {};修飾的是struct str型別。所有該型別的變數都受__declspec(align(8))影響。

align:

格式:__declspec(align(n)) declarator

其中,n是對齊引數,其有效值是的整數次冪(從到位元組),如,,,,或。引數declarator是要設定對齊方式的資料。

1.使用__declspec(align(n))來精確控制使用者自定義資料的對齊方式。你可以在定義struct,union,class或宣告變數時使用__declspec(align(n))。

2.不能為函式引數使用__declspec(align(n))。

3.如果未使用__declspec(align(#)),編譯器將根據資料大小按自然邊界對齊。如位元組整數按位元組邊界對齊;位元組double按位元組邊界對齊。類或結構體中的資料,將取資料本身的自然對齊方式和#pragma pack(n)設定的對齊係數中的最小值進行對齊。

4.__declspec(align(n))和#pragma pack(n)是一對兄弟,前者規定了對齊係數的最小值,後者規定了對齊係數的最大值。

5.當兩者同時出現時,前者擁有更高的優先順序。即,當兩者同時出現且值矛盾時,後者將不起作用。

6.當變數size大於等於#pragma pack(n)指定的n,而且__declspec(align(n))指定的數值n比對應型別長度小的時候,這個__declspec(align(n))指定將不起作用。

7.當#pragma pack(n)指定的值n大於等於所有資料成員size的時候,這個值n將不起作用。

allocate:

格式:__declspec(allocate("segname")) declarator

為資料指定儲存的資料段。資料段名必須為以下列舉中的乙個:

code_seg

const_seg

data_seg

init_seg

section

指定託管程式中的每個應用程式域都要有乙份指定全域性變數或靜態成員變數的拷貝。

deprecated:

與#pragma deprecated()的作用相同。用於指定函式的某個過載形式是不推薦的。當在程式中呼叫了被deprecated修飾的函式時,編譯器將給出c4996警告,並且可以指定具體的警告資訊。該警告資訊可以**於定義的巨集。

例如:// compile with: /w3

#define my_text "function is deprecated"

void func1(void) {}

__declspec(deprecated) void func1(int) {}

__declspec(deprecated("** this is a deprecated function **")) void func2(int) {}

__declspec(deprecated(my_text)) void func3(int) {}

int main()

int main() ;

int i;

__declspec(selectany) x x(1); //正確,全域性物件的動態初始化

thread:

格式:__declspec(thread) declarator

宣告declarator為執行緒區域性變數並具有執行緒儲存時限,以便鏈結器安排在建立執行緒時自動分配的儲存。

執行緒區域性儲存(tls)是一種機制,在多執行緒執行環境中,每個執行緒分配自己的區域性資料。在標準多執行緒程式中,資料是在多個執行緒間共享的,而tls是一種為每個執行緒分配自己區域性資料的機制。

該屬性只能用於資料或不含成員函式的類的宣告和定義,不能用於函式的宣告和定義。

該屬性的使用可能會影響dll的延遲載入。

該屬性只能用於靜態資料,包括全域性資料物件(static和extern),區域性靜態物件,類的靜態資料成員;不能用於自動資料物件。

該屬性必須同時用於資料的宣告和定義,不管它的宣告和定義是在乙個檔案還是多個檔案。

__declspec(thread)不能用作型別修飾符。

如果在類宣告的同時沒有定義物件,則__declspec(thread)將被忽略,例如:

// compile with: /ld

__declspec(thread) class x

public:

int i;

} x;   //x是執行緒物件

x y;   //y不是執行緒物件

下面兩個例子從語義上來說是相同的:

__declspec(thread) class b bobject;   //bobject是執行緒物件

class b2 ")) idispatch;

C Explicit關鍵字詳細解析

知道c 中有explicit關鍵字,但對其用法和作用的理解有些模糊,今天有時間給系統的澄清一下 explicit關鍵字用來修飾類的建構函式,表明建構函式是顯示的,相對的是implicit關鍵字。首先這個關鍵字只能用在類內部的建構函式宣告上,而不能用在類外部的函式定義上,它的作用是不能進行隱式轉換。用...

new關鍵字 this關鍵字 base關鍵字

使用new,所做的三件事 1.類是引用物件,引用物件是在堆中開闢空間 在堆中開闢空間 2.在開闢的堆空間中建立物件 3.呼叫物件的構建函式 4.隱藏父類成員 子類的成員可以與隱藏從父類繼承的成員,類似於重寫。public new void sayhello this關鍵字的使用 1.代表當前類的物件...

this關鍵字 static關鍵字

1.當成員變數和區域性變數重名,可以用關鍵字this來區分 this 代表物件,代表那個物件呢?當前物件 this就是所在函式所屬物件的引用 簡單說 那個物件呼叫了this所在的函式,this就代表哪個物件 this也可以用於在建構函式中呼叫其他建構函式 注意 只能定義在建構函式的第一行,因為初始化...