Vulkan 中的 VKAPI_ATTR 和 VKAPI_CALL 宏

VKAPI_ATTR and VKAPI_CALL macros in Vulkan

我一直在寻找,但我仍然不确定 VKAPI_ATTRVKAPI_CALL 是什么。我不确定它们是宏还是一些我不知道的花哨的 C++ 函数声明。

什么是 VKAPI_ATTR void VKAPI_CALL vkCommand(void) 提供而 void vkCommand(void) 不提供的?

它们是确保应用正确调用约定的宏。这在 64 位中不太重要,它们大部分已经收敛,但在 32 位中有几个不兼容的。

不幸的是,不同的编译器有不同的方式来做到这一点。一个将所需的标记放在 return 值之前,另一个将其放在后面。

因此 header 两者都使用以确保它可以涵盖所有基础。

它们在 vk_platform.h 中定义。

它们是 C 预处理器宏,可扩展为依赖于平台(并且通常是特定于编译器)的函数属性。

spec 定义了他们应该做什么。
但基本上每个 VKAPI_ATTRVKAPI_CALLVKAPI_PTR 的区别在于它必须在函数声明中的位置以满足 C(可能依赖于编译器)语法。
它们的值类似于为平台选择的调用约定(例如__stdcall)(在编译时检测)。