Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Windows 綜合教學 >> Windows 技巧

__declspec 關鍵字完整用法詳解:從 align 到 uuid 的 20 種擴充屬性

編輯:Windows 技巧

__declspec 是 Microsoft C/C++ 編譯器擴充屬性語法,用於指定儲存類別、對齊、匯入匯出、執行緒區域儲存等編譯器導向屬性。本文系統整理 20 種擴充修飾詞語法、語義、程式碼範例與注意事項,為 Windows 平台開發者的參考手冊。

語法基本型

__declspec ( extended-decl-modifier ) declarator

多個修飾詞以空格分隔。__declspec 應置於簡單宣告之前;置於 */& 後或識別符前將被忽略不警告。須區分修飾「型別」還是「變數」:
__declspec(align(8)) struct Str b; 修飾變數 b。
__declspec(align(8)) struct Str {}; 修飾型別 Str,所有實例受影響。

20 種擴充修飾詞速查表

修飾詞用途關鍵備註
align指定資料對齊邊界 (1-8192 位元組,2 的冪次)優先於 #pragma pack;不可用於函式參數
allocate指定資料區段 (code_seg/const_seg/data_seg/init_seg/section)需搭配區段名稱字串
appdomain每個應用程式域擁有獨立全域/靜態變數拷貝Managed 程式碼專用
deprecated標記不建議使用的函式多載,編譯器發出 C4996 警告可自訂警告訊息 __declspec(deprecated("msg"))
dllimport從 DLL 匯入函式/資料/物件替代 .def 檔;C++ 名稱修飾預設啟用,需 extern "C" 禁用
dllexport從 DLL 匯出函式/資料/物件替代 __export;同名稱修飾規則
jitintrinsic標記 64 位 CLR 內建函式主要供 Microsoft 內部庫使用
naked編譯器不產生序言/結語碼(無 prolog/epilog)僅 x86、虛擬裝置驅動;僅用於函式定義
noalias宣告函式為「半純粹」(僅存取區域/參數/一層間接)違反將產生中斷程式碼
restrict告知編譯器回傳指標不與其他指標重疊優化輔助;屬承諾不驗證,違反導致未定義行為
noinline強制函式不內聯適用類別內定義預設為 inline 的成員函式
noreturn告知編譯器函式永不返回消除後續碼不可到達警告 (C4715/C2202)
nothrow宣告函式及內部呼叫不拋出例外優化例外處理碼路徑
novtable抑制純介面類別 vfptr 初始化,減小程式碼體積僅用於不具現化的純介面類別;具現化將導致 AV
process進程層級共享全域/靜態變數拷貝(預設 AppDomain 隔離時)需搭配 /clr:pure;變數應為 const
property將成員函式映射為屬性存取get/put 對應讀寫權限;可用於空陣列
selectany允許標頭檔中初始化全域變數,連結器自動消除重複定義極利於 template 程式設計;const 需加 extern
thread宣告執行緒區域儲存 (TLS) 變數僅靜態資料;不可用於函式;聲明與定義皆需標記
uuid指定 COM 物件 GUID,支援 __uuidof() 取得格式 __declspec(uuid("GUID"))

重點範例精選

align 與 #pragma pack 互動

__declspec(align(n)) 規定最小對齊,#pragma pack(n) 規定最大對齊;同時出現時 align 優先。若變數大小 ≥ pack(n) 且 align 指定值小於型別長度,align 失效。

selectany 解決標頭檔全域變數初始化

__declspec(selectany) int x1 = 1;           // 正確
extern const __declspec(selectany) int x3 = 3; // 正確
__declspec(selectany) X x(1);                // 全域物件動態初始化正確

thread TLS 變數宣告

__declspec(thread) int tlsVar;               // 正確
__declspec(thread) class B { int data; } BObject; // BObject 為 TLS 物件

property 映射存取子

struct S {
  int i;
  void putprop(int j) { i = j; }
  int getprop() { return i; }
  __declspec(property(get=getprop, put=putprop)) int the_prop;
};
S s; s.the_prop = 5; // 呼叫 putprop(5)

結語

__declspec 是 Windows 平台 C/C++ 開發的核心擴充機制,掌握其 20 種修飾詞語義與互動規則,能精準控制記憶體佈局、匯出介面、執行緒隔離與編譯器優化,是系統級與高效能程式設計的必備工具。

Copyright © Windows教程網 All Rights Reserved