3

我一直在使用PInvoke讓我的C#應用​​程序調用我編寫的C++函數。使用PInvoke時,爲什麼使用__stdcall?

現在,我一直聽到無處不在,我需要用__stdcall慣例定義那些外部可訪問的函數。我的問題是:爲什麼?

到目前爲止,我不小心忽略了這個建議,而且一切都像魅力一樣。當我將__stdcall添加到我的函數中時,所有內容都以相同的方式工作(或者至少看起來如此)。

This article__stdcall用於Win32位功能,但我正在編譯對付x64平臺。這是否意味着我不應該使用__stdcall,還是意味着我錯過了其他的東西?

請回復時用簡單的英文。 ;-)這樣的行(引自我鏈接的文章):

被調用者清除堆棧,因此編譯器使可變參數函數__cdecl。

讓我的大腦感受到吹過它的風滾草。

回答

4

在x64上只有一個調用約定,因此不管您指定哪種調用約定。它在x64上始終被忽略。

在x86上,確保調用約定在接口的兩側相匹配是非常重要的。所以,如果你曾經預計在x86上運行你的代碼,現在就明白這一點。

+0

這是有道理的更多細節。實際上,我應該讓我的圖書館能夠讓任何人最終使用它,所以我會確保在需要的地方使用__stdcall。 – 2013-04-05 11:23:33

2

你錯過了x64和Win32完全不同的事實。 Win32是與Windows交互的C API,其calling convention__stdcall,而x64或x86-64是CPU寄存器的大小。 (即64位寬)。

在根據X86-64維基百科的文章調用約定:

當在Windows方面的x64體系結構編譯(無論是使用Microsoft或非Microsoft工具),只有一個調用約定 - 一個在這裏描述,以便stdcall,thiscall,cdecl,fastcall等現在都是一樣的。

顯然x64(AMD)不在乎調用約定,但希望上面的問題清除了一些混淆。

+0

謝謝,這聽起來很有用。 – 2013-04-05 11:22:15

+0

這不會清除任何東西。這裏的術語是錯誤的。 Win32是一個具有32和64版本的API。而x64是最初由AMD指定的處理器架構。 – 2013-04-05 11:24:09

2

調用約定是32位代碼中的歷史事件。在64位代碼中只有一個約定,所以你聲明的無關緊要。

如果您編寫的非託管32位DLL可能由未用C或C++編寫的代碼使用,那麼使用__stdcall聲明導出的函數有助於減少事故。大多數語言運行時支持互操作以允許OS調用,因此它們使__stdcall成爲默認值。

,可以找到關於調用約定和名字裝飾this answer

相關問題