共用方式為


名稱裝飾

名稱裝飾通常指的是 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++命名的標準。 連結由其他編譯程式編譯的物件檔案可能不會產生相同的命名配置,而且可能會導致無法解析的外部。

另請參閱

連結器工具錯誤 LNK2001