int __cdecl funcB(int a。int b) {
return 0;
}
int __stdcall funcA(int a, int b) {
return funcA(a, b)。
}
我寫了這兩個函式,它們有不同的呼叫慣例。__stdcall和__cdecl。
而我的問題是,為什么MSVC沒有拋出一個編譯錯誤呢?
因為在我看來,兩個具有不同呼叫約定的函式不能互相呼叫
如果呼叫者認為被呼叫者應該清理堆疊,而被呼叫者認為呼叫者應該清理堆疊,這就是我的問題任何答案都將是有幫助的uj5u.com熱心網友回復:
因為在我看來,兩個具有不同呼叫約定的函式不能互相呼叫
這只是一個不正確的觀點。呼叫約定只是一組關于如何在整個呼叫中處理引數的規則。編譯器會在每個呼叫點和函式的主體中生成指令,這些指令遵循函式定義的任何慣例。
如果呼叫者認為被呼叫者應該清理堆疊,而被呼叫者認為呼叫者應該清理堆疊,這就是我的問題你所想的問題是當呼叫約定被省略時,不同的翻譯單元以不同的默認約定進行編譯。一個 TU 中的宣告的使用方式與另一個 TU 中的定義不兼容。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/321886.html
標籤:
上一篇:在pimpl中傳遞部分構建的物件
