#if _MSC_VER > 1000
#pragma once
#endif
_MSC_VER:Microsoft C/C++ 編譯器版本號宏。
_MSC_VER > 1000:判斷編譯器版本是否**高於 VC++ 5.0**(版本 1100)。#pragma once:告訴編譯器**「本文件在一次編譯過程中只被包含一次」**,替代傳統 #ifndef/#define/#endif 防衛宏。早期 MSVC(≤5.0)**不支援** #pragma once。若無條件使用,舊版編譯器會報錯或忽略,導致頭文件重復包含引發重定義錯誤。版本判斷實現「新編譯器享受高效機制,舊編譯器回退傳統防衛宏」。
// MyHeader.h
#if _MSC_VER > 1000
#pragma once // MSVC 專用,編譯速度快(無需再次打開文件掃描)
#endif
#ifndef __MYHEADER_H__ // 標準 C/C++ 通用防衛宏,兜底
#define __MYHEADER_H__
// ... 聲明內容 ...
#endif // __MYHEADER_H__
| 維度 | #pragma once | 防衛宏 (#ifndef) |
|---|---|---|
| 編譯速度 | 快(文件系統層面去重,不打開文件) | 較慢(需打開文件掃描宏) |
| 可移植性 | MSVC、GCC、Clang 現代版本均支援 | 100% 標準,所有編譯器 |
| 符號鏈接/重命名風險 | 同一文件不同路徑可能被視為不同文件 | 宏名唯一,無路徑依賴 |
| 推薦策略 | 雙重保護:外層 #pragma once 加速,內層防衛宏兜底 | |
_MSC_VER 代表 Visual Studio 版本。#pragma once 能完全替代防衛宏。
// test_ver.c
#include <stdio.h>
int main() {
printf("_MSC_VER = %d\n", _MSC_VER);
return 0;
}
在 MSVC 開發者命令提示行編譯運行,即可獲取當前編譯器版本號。