11

我是新手,正在学习 C++(了解很多 Java),下面的代码让我感到困惑......

在此处输入图像描述

我知道这个代码片段正在处理一个指向函数的指针(这是一个回调,这是有道理的),但让我失望的是返回类型和函数名之间的参数。那是什么鬼东西?

它看起来像是一种函数,但我从未听说过,即使在搜索和阅读了指向函数的指针之后,我也找不到任何提到函数可以具有类型的内容。

如果这是真的,如何定义一种函数类型?

谢谢,-科迪

4

4 回答 4

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 上使用正确的调用约定很重要,因为其中一些期望堆栈由被调用者清理,而另一些则由调用者清理。传递参数的顺序也可能有所不同。

于 2012-12-07T19:00:20.563 回答
9

在 Windows 上,GLFWCALL它是一个宏__stdcall,而在其他平台上,它是一个无用的宏。

__stdcall实现了特定的调用约定,并且是普通 C 或 C++ 之上的编译器扩展。

宏是在编译器的词法分析器和解析器与它们交互之前对代码进行替换的代码片段。

于 2012-12-07T18:59:14.933 回答
6

如果需要,它GLFWCALL是一个可以扩展为调用约定的宏。因为这个函数会被外部代码调用,所以它必须使用外部代码所期望的调用约定。例如,如果函数将其返回值放在堆栈中,而外部代码期望它在寄存器中,则繁荣。

于 2012-12-07T18:59:25.907 回答
1

函数签名的问题标记部分是一个预处理器宏,它在标题的其他地方定义。某些平台上的某些功能有额外的要求。

例如,Windows 平台上的 DLL 文件中的函数通常使用 __declspec(dllexport) 修饰符,但是当用户项目中包含相同的头文件时,他们需要使用 __declspec(dllimport)。为此目的使用预处理器宏意味着他们可以只在所有相关函数上使用该宏,并在编译自己的 DLL 或用户的 DLL 时以及在 __declspec 不相关的平台上以不同方式定义宏,可以将其定义为空。像这样的宏还有许多其他原因。

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

于 2012-12-07T19:10:03.283 回答