这个虚空破解坏了吗

Is this void* hack bad?

本文关键字:坏了 破解      更新时间:2024-09-23

在标题中,我定义了一个类函数,如下所示:

struct SDL_Window; // Forward declaration
struct SomeClass
{
void createVulkanSurface(SDL_Window* SDL_window, VkInstance vkInstance, VkSurfaceKHR vkSurface);
};

所以编译器不知道VkInstance和VkSurfaceKHR是什么。它们是由宏定义的typedef。它们可能是类型化的指针,也可能是uint64_t,它只是一个句柄。我认为唯一安全的事情(而不是向前声明这些并冒着更改类型的风险(是包含定义这些typedef的vulkan.h标头,但我不想这样做,因为它是一个大标头,它也会包含在我包含.h标头的任何内容中。我曾想过将函数签名更改为:

void createVulkanSurface(SDL_Window* SDL_window, void* vkInstance, void* vkSurface);

然后在.cpp中,我定义了这个函数,将其转换回VkInstance和VkSurface。我知道这是安全的,因为void*指针可以转换为任何指针类型。如果typedef是uint64_t,那么转换为void*并返回可能会缩小值,因为指针是它下面的有符号整数类型,不是吗?

编辑:我只是想,也许把这些论点当作uint64_t会更好吗?

我不建议使用Vulkan标头提供的声明以外的任何内容。在指针和整数之间转换是有风险的,充其量也容易出错,而且绝对不是解决问题的推荐方法。特别是如果它是一个宏(它可以是任何东西,甚至是一个表达式(。有一些方法可以最大限度地减少必须包含会污染项目的大型标头的影响。

如果您创建一个";渲染器";抽象,并将Vulcan标头包含在源文件中(每个包含一个翻译单元(或仅在渲染器实现中使用的标头中。您将其包含限制为仅包含必要的翻译单元。