这个虚空破解坏了吗
Is this void* hack bad?
在标题中,我定义了一个类函数,如下所示:
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标头包含在源文件中(每个包含一个翻译单元(或仅在渲染器实现中使用的标头中。您将其包含限制为仅包含必要的翻译单元。
相关文章:
- 在提升multi_index容器中,是否定义了"default index"?
- #定义c-预处理器常量..我做错了什么
- 努力将整数转换为链表。不知道我在这里做错了什么
- 我在c++代码中生成了一个运行时#3异常
- Ardunio UNO解决了多个重叠的定时器循环
- 为什么我的代码在输出中增加了93天
- C++为什么尽管我调用了void函数,它却不起作用
- 不断收到相同的错误...怎么了?C++
- wxWidgets mac剪贴板在3.1.3上坏了?
- 计时器坏了或者其他什么的
- boost::p rocess::env 在 ubuntu 19.04 上坏了?
- std::regex 是否保证了最坏情况下的时间复杂度?
- 课堂上的一行,使整个应用程序坏了. 0xC000005错误
- SFML sf::Text::setFillColor 坏了,还是我做错了什么
- 开关内的案例不停地循环,即使我坏了
- 溪水变坏了
- 我最基本的c++程序坏了,我不知道为什么
- 我的电脑怎么坏了?
- 条件评估是否优化?这个代码坏了吗
- 地图:坏Ptr,即使找到了钥匙