2012-12-07 54 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无关的平台上以不同的方式定义宏。像这样的宏有许多其他原因。

在这种特殊情况下,您可以有效地假装该宏是空白的,并完全忽略它。