__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,所有實例受影響。
| 修飾詞 | 用途 | 關鍵備註 |
|---|---|---|
| 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")) |
__declspec(align(n)) 規定最小對齊,#pragma pack(n) 規定最大對齊;同時出現時 align 優先。若變數大小 ≥ pack(n) 且 align 指定值小於型別長度,align 失效。
__declspec(selectany) int x1 = 1; // 正確
extern const __declspec(selectany) int x3 = 3; // 正確
__declspec(selectany) X x(1); // 全域物件動態初始化正確
__declspec(thread) int tlsVar; // 正確
__declspec(thread) class B { int data; } BObject; // BObject 為 TLS 物件
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 種修飾詞語義與互動規則,能精準控制記憶體佈局、匯出介面、執行緒隔離與編譯器優化,是系統級與高效能程式設計的必備工具。