2010-12-18 91 views
1

我很難理解WINAPI標籤與c相關的內容。c函數中WINAPI標籤的正確名稱是什麼?

例如:

BOOL WINAPI CreateProcessA(...);

這個WINAPI標籤到底是什麼,它有更正式的名稱,它是C還是實現特定的一部分?

對不起,如果我的問題有點混亂。

非常感謝!

+0

欣賞所有答案! – 2010-12-18 18:56:10

回答

1

在標準的條款,它是一個存儲類說明(如「靜態」),一個類型說明符(如「無符號」),或一個類型限定符(如「常量」)。不同的是,如果它是任何一種說明,你不能寫

BOOL * WINAPI CreateProcessA(...); 

但如果它是一個限定符,你可以。無論如何,這是Windows編譯器的一個非標準功能。 (我發現其他人已經指出,實際上「WINAPI」是一個宏,但它是一個由實現提供的宏,所以你應該把它看作一種語言特性,而不是看它是什麼擴展爲)。

+0

我認爲你的意思是「存儲類說明符」而不是「類型說明符」。 「static」是一個存儲類說明符。 「類型說明符」就像「unsigned int」。 – 2010-12-18 18:51:15

+0

謝謝,感謝! – 2010-12-18 18:55:48

+0

@Laurence:我忘記了有兩種說明符。謝謝。 – zwol 2010-12-18 18:58:56

1

這是一個宏,即預處理器將其替換爲在實際編譯之前被#defined定義的任何宏。特別是,WINAPI宏被定義爲告訴函數使用哪個調用約定。

-1
#define WINAPI __stdcall 

這意味着CreateProcessA的參數將從左到右計算。

+4

不正確,參數仍然從右向左推入棧中,但該函數需要清理棧而不是調用者。 – 2010-12-18 18:42:41

+0

@Mirhan AFAI記住它意味着C和Pascal調用約定的一些混合 - 參數如何被推入堆棧,以及誰清除堆棧 - 調用者或函數本身。 – khachik 2010-12-18 18:44:20

+0

調用約定記錄在[MSDN]上(http://msdn.microsoft.com/en-us/library/zxk0tw93%28v=VS.100%29.aspx)。 – 2010-12-18 18:47:28

4

它是calling convention,通常定義爲Windows的__stdcall

+0

)這是一個巨大的用詞不當,因爲「__stdcall」完全是**非標準的**,違背了正常的C和普通的x86調用約定,效率極低 – 2010-12-18 18:50:10

+3

在x86中,區別是\ _ \ _ stdcall函數返回並清理在一個彙編語言指令中使用堆棧,而\ _ \ _cdecl函數只是返回而調用者必須在第二條指令中清除堆棧,那麼*非常*效率低下,看起來可能*效率更高* – 2010-12-18 19:06:27

+1

@R .. __stdcall是非標準的是一個非標準的,它不是C中的正常做法,也是一個非限制性的,但它是Windows x86上的標準調用約定,所以它的名字非常合理。 – 2010-12-18 19:13:56

相關問題