名稱裝飾
名稱裝飾通常指的是 C++ 命名慣例,但也可以套用到一些 C 的案例。 根據預設,C++ 會使用函式名稱、參數和傳回類型來建立函式的連結器名稱。 請考慮下列函式宣告:
void CALLTYPE test(void);
下表顯示各種呼叫慣例的連結器名稱。
呼叫慣例 | extern "C" 或 .c 檔案 |
.cpp 、.cxx 或 /TP |
---|---|---|
C 命名慣例 (__cdecl ) |
_test |
?test@@ZAXXZ |
快速通話命名慣例 (__fastcall ) |
@test@0 |
?test@@YIXXZ |
標準通話命名慣例 (__stdcall ) |
_test@0 |
?test@@YGXXZ |
向量呼叫命名慣例 (__vectorcall ) |
test@@0 |
?test@@YQXXZ |
使用 extern "C"
從 C++ 呼叫 C 函式。 extern "C"
強制使用非類別C++函式的 C 命名慣例。 請注意編譯程序參數 /Tc 或 /Tp,這會告知編譯程式忽略擴展名,並將檔案編譯為 C 或 C++。 這些選項可能會導致您不預期的連結器名稱。
參數不相符的函式原型也可能導致這個錯誤。 名稱裝飾會將函式的參數納入最終的裝飾函式名稱。 使用不符合函式宣告中的參數類型呼叫函式,也可能會導致LNK2001。
編譯程式廠商之間,甚至不同版本的編譯程序之間,目前沒有C++命名的標準。 連結由其他編譯程式編譯的物件檔案可能不會產生相同的命名配置,而且可能會導致無法解析的外部。