在 DLL 專案中自訂函數 PrintScreen(HWND, WORD, WORD, WORD, LPSTR, BOOL),與 Windows SDK winuser.h 中的 PrintScreen(HWND, WORD, WORD) 同名但參數不同,導致 VS2012+ 編譯報「重新定義」錯誤(VS6.0 較寬鬆不報錯)。
windows.h 通常會被專案預編譯標頭或通用標頭引入,導致系統版 PrintScreen 進入全域命名空間。MyLib_PrintScreen、Utils_PrintScreen,語義清晰且零衝突。namespace MyProject {
WORD WINAPI PrintScreen(HWND, WORD, WORD, WORD, LPSTR, BOOL);
}
// 調用時
MyProject::PrintScreen(...);
需確保標頭檔宣告與實作檔定義均在同一命名空間。windows.h,並用 #undef PrintScreen 取消巨集/函數宣告(極不推薦,破壞系統標頭完整性)。static 或放在 namespace { ... },不導出符號,但 WINAPI 通常暗示導出,故不適用。MYPROJ_、MyLib_),內部函數用匿名命名空間或 static。Create、Open、Close、Read、Write、Print、Draw、Get/Set 開頭的通用動詞。「不與系統同名」是 C/C++ 程式庫開發的鐵律,前綴命名法成本最低、效果最好。