2012-12-07 88 views
11

我是新來的,學習C++(知道有很多的Java)和下面的代碼混淆了我......C++函數類型?

enter image description here

我知道這個代碼片段處理一個指針到函數(這是一個回調,這是有道理的),但是拋出我的是返回類型和函數名稱之間的參數。那該死的是什麼?

它看起來像一種功能,但我從來沒有聽說過,甚至在搜索和閱讀有關指針函數後,我無法找到任何提及該函數可能有類型的東西。

如果這是真的,如何定義一個函數類型?

感謝,-Cody

+2

那本書是什麼?而且這段代碼看起來更接近於C而不是C++(考慮到它似乎是一本OpenGL書籍,這並不令我感到意外)。 –

+1

這是不是調用約定,如在stdcall/fastcall/regcall ...? –

+0

您將在一些使用調用約定的編譯器中進行註釋。 – rerun

回答

10

GLFWCALL不是一種類型,它是一個擴展到特定於平臺的調用約定或空字符串的宏。下面是glfw.h的剪裁片段:

#if defined(_WIN32) && defined(GLFW_BUILD_DLL) 
#define GLFWCALL  __stdcall 
#elif defined(_WIN32) && defined(GLFW_DLL) 
#define GLFWCALL  __stdcall 
#else 
/* We are either building/calling a static lib or we are non-win32 */ 
#define GLFWCALL 
#endif 

使用正確的調用約定在x86/win32的重要,因爲他們中的一些預期堆棧由被叫方和其他主叫方進行清洗。傳遞參數的順序也可能有所不同。

+0

請注意,一些調用約定(帶<4參數的fastcall)完全不使用堆棧。 –

+1

取決於*哪個* fastcall,也是:) MS fastcall使用ecx和edx,Borland使用eax/edx/ecx和Watcom全部四個eax/edx/ebx/ecx。 –

+0

WAT?有不同的fastcall版本,都被命名爲fastcall? –

9

在Windows上,GLFWCALL__stdcall一個宏,在其他平臺上,它是什麼宏。

__stdcall實現了一個特定的調用約定,並且是在普通C或C++之上的編譯器擴展。

宏是在您的編譯器的詞法分析器和解析器與它們進行交互之前替代您代碼的代碼片斷。

6

GLFWCALL是一個宏,如果需要的話可以擴展到calling convention。因爲這個函數將被外部代碼調用,所以它必須使用外部代碼期望的調用約定。例如,如果該函數將其返回值放在堆棧上,並且外部代碼將其置於寄存器中,則繁榮。

1

函數簽名的標記部分是一個預處理器宏,它是在頭文件的其他地方定義的。某些平臺上的某些功能有額外的要求。

例如,Windows平臺上的DLL文件中的函數通常使用__declspec(dllexport)修飾符,但是當用戶項目中包含相同的頭時,他們需要使用__declspec(dllimport)。爲此目的使用預處理器宏意味着他們可以在所有相關函數中使用該宏,並且在編譯自己的DLL或用戶的DLL時以及在__declspec無關的平臺上以不同的方式定義宏。像這樣的宏有許多其他原因。

在這種特殊情況下,您可以有效地假裝該宏是空白的,並完全忽略它。