我很難理解WINAPI標籤與c相關的內容。c函數中WINAPI標籤的正確名稱是什麼?
例如:
BOOL WINAPI CreateProcessA(...);
這個WINAPI標籤到底是什麼,它有更正式的名稱,它是C還是實現特定的一部分?
對不起,如果我的問題有點混亂。
非常感謝!
我很難理解WINAPI標籤與c相關的內容。c函數中WINAPI標籤的正確名稱是什麼?
例如:
BOOL WINAPI CreateProcessA(...);
這個WINAPI標籤到底是什麼,它有更正式的名稱,它是C還是實現特定的一部分?
對不起,如果我的問題有點混亂。
非常感謝!
在標準的條款,它是一個存儲類說明(如「靜態」),一個類型說明符(如「無符號」),或一個類型限定符(如「常量」)。不同的是,如果它是任何一種說明,你不能寫
BOOL * WINAPI CreateProcessA(...);
但如果它是一個限定符,你可以。無論如何,這是Windows編譯器的一個非標準功能。 (我發現其他人已經指出,實際上「WINAPI」是一個宏,但它是一個由實現提供的宏,所以你應該把它看作一種語言特性,而不是看它是什麼擴展爲)。
我認爲你的意思是「存儲類說明符」而不是「類型說明符」。 「static」是一個存儲類說明符。 「類型說明符」就像「unsigned int」。 – 2010-12-18 18:51:15
謝謝,感謝! – 2010-12-18 18:55:48
@Laurence:我忘記了有兩種說明符。謝謝。 – zwol 2010-12-18 18:58:56
這是一個宏,即預處理器將其替換爲在實際編譯之前被#defined定義的任何宏。特別是,WINAPI宏被定義爲告訴函數使用哪個調用約定。
#define WINAPI __stdcall
這意味着CreateProcessA
的參數將從左到右計算。
不正確,參數仍然從右向左推入棧中,但該函數需要清理棧而不是調用者。 – 2010-12-18 18:42:41
@Mirhan AFAI記住它意味着C和Pascal調用約定的一些混合 - 參數如何被推入堆棧,以及誰清除堆棧 - 調用者或函數本身。 – khachik 2010-12-18 18:44:20
調用約定記錄在[MSDN]上(http://msdn.microsoft.com/en-us/library/zxk0tw93%28v=VS.100%29.aspx)。 – 2010-12-18 18:47:28
它是calling convention,通常定義爲Windows的__stdcall
。
)這是一個巨大的用詞不當,因爲「__stdcall」完全是**非標準的**,違背了正常的C和普通的x86調用約定,效率極低 – 2010-12-18 18:50:10
在x86中,區別是\ _ \ _ stdcall函數返回並清理在一個彙編語言指令中使用堆棧,而\ _ \ _cdecl函數只是返回而調用者必須在第二條指令中清除堆棧,那麼*非常*效率低下,看起來可能*效率更高* – 2010-12-18 19:06:27
@R .. __stdcall是非標準的是一個非標準的,它不是C中的正常做法,也是一個非限制性的,但它是Windows x86上的標準調用約定,所以它的名字非常合理。 – 2010-12-18 19:13:56
欣賞所有答案! – 2010-12-18 18:56:10