Vulkan 中的 VKAPI_ATTR 和 VKAPI_CALL 宏
VKAPI_ATTR and VKAPI_CALL macros in Vulkan
我一直在寻找,但我仍然不确定 VKAPI_ATTR
和VKAPI_CALL
是什么。我不确定它们是宏还是一些我不知道的花哨的 C++ 函数声明。
什么是 VKAPI_ATTR void VKAPI_CALL vkCommand(void)
提供而 void vkCommand(void)
不提供的?
它们是确保应用正确调用约定的宏。这在 64 位中不太重要,它们大部分已经收敛,但在 32 位中有几个不兼容的。
不幸的是,不同的编译器有不同的方式来做到这一点。一个将所需的标记放在 return 值之前,另一个将其放在后面。
因此 header 两者都使用以确保它可以涵盖所有基础。
它们在 vk_platform.h 中定义。
它们是 C 预处理器宏,可扩展为依赖于平台(并且通常是特定于编译器)的函数属性。
spec 定义了他们应该做什么。
但基本上每个 VKAPI_ATTR
、VKAPI_CALL
和 VKAPI_PTR
的区别在于它必须在函数声明中的位置以满足 C(可能依赖于编译器)语法。
它们的值类似于为平台选择的调用约定(例如__stdcall
)(在编译时检测)。
我一直在寻找,但我仍然不确定 VKAPI_ATTR
和VKAPI_CALL
是什么。我不确定它们是宏还是一些我不知道的花哨的 C++ 函数声明。
什么是 VKAPI_ATTR void VKAPI_CALL vkCommand(void)
提供而 void vkCommand(void)
不提供的?
它们是确保应用正确调用约定的宏。这在 64 位中不太重要,它们大部分已经收敛,但在 32 位中有几个不兼容的。
不幸的是,不同的编译器有不同的方式来做到这一点。一个将所需的标记放在 return 值之前,另一个将其放在后面。
因此 header 两者都使用以确保它可以涵盖所有基础。
它们在 vk_platform.h 中定义。
它们是 C 预处理器宏,可扩展为依赖于平台(并且通常是特定于编译器)的函数属性。
spec 定义了他们应该做什么。
但基本上每个 VKAPI_ATTR
、VKAPI_CALL
和 VKAPI_PTR
的区别在于它必须在函数声明中的位置以满足 C(可能依赖于编译器)语法。
它们的值类似于为平台选择的调用约定(例如__stdcall
)(在编译时检测)。