【问题标题】:How to marshall struct defined from macros in C header?如何编组从 C 头文件中的宏定义的结构?
【发布时间】:2016-10-07 13:27:00
【问题描述】:

我不知道如何将Vulkan API header file 的下一部分编组以供 C# 使用:

#define VK_DEFINE_HANDLE(object) typedef struct object##_T* object;
...
VK_DEFINE_HANDLE(VkInstance)

以后需要在这个方法中使用:

VKAPI_ATTR VkResult VKAPI_CALL vkCreateInstance(
    const VkInstanceCreateInfo*  pCreateInfo,
    const VkAllocationCallbacks* pAllocator,
    VkInstance*                  pInstance
);

指向vkInstance,好的。但是,这是什么神奇的东西:typedef struct object##_T* object; 宏风格(预处理器)?

【问题讨论】:

  • 我只是在 C# 中创建了一个结构,确保类型大小与 c++ 相同。不需要元帅。
  • VkInstance,以及所有其他不可调度的 Vulkan 句柄,只是(是)指向通用结构的指针。
  • 如果您有兴趣,我们中的一些人已经为 Vulkan 编写了 C# 绑定 - github.com/FacticiusVir/SharpVk/blob/master/SharpVk/SharpVk/…
  • @FacticiusVir 谢谢 :) 太好了

标签: c# c++ pinvoke marshalling vulkan


【解决方案1】:

## 是 C++ 预处理器中的连接运算符 - 所以在上面的示例中

#define VK_DEFINE_HANDLE(object) typedef struct object##_T* object;
VK_DEFINE_HANDLE(VkInstance)

将扩展到

typedef struct VkInstance_T* VkInstance;

【讨论】:

  • 我明白了,但是我如何检查VkInstance 是哪个?我正在尝试跳入它的定义,但不能超过VK_DEFINE_HANDLE(VkInstance),它引用了宏?如何编组它?它是一个空结构吗?谢谢
  • 它是一个指向结构的指针。没有其他的。您可以将 VK_DEFINE_HANDLE 解释为一种 typedef void* VkInstance; ,+ 或 - 更少 @PaulIF 上面写的内容。
  • 尝试谷歌搜索 VkInsatnce - 这是列表的顶部:khronos.org/registry/vulkan/specs/1.0/man/html/VkInstance.html
【解决方案2】:

从您的 cmets 看来,您似乎想知道 VkInstance 句柄的内容,以便您可以将其保存到磁盘或通过网络传输。

这是不可能的。不仅没有指定VkInstance(以及任何其他 Vulkan 句柄)的实际内容,它们不能在编译时指定,因为它们的内容完全依赖于 Vulkan 实现您的程序恰好与一起运行(例如,Nvidia 的 VkInstance 的内容肯定不会匹配 AMD 的 VkInstance 或 Intel 的)。

即使您以某种方式知道结构布局,也无法简单地保存它,因为我可以向您保证,它将包含对无法保存的运行时资源的引用,例如套接字或驱动程序资源句柄。

【讨论】:

  • 很好的答案,非常感谢 :) 顺便说一句,我已经通过 C# 成功创建了 Vulkan 实例,证明:s17.postimg.org/uzmt2tv5r/i168_cimgpsh_orig.png
  • @MatthewTipton 嗯,是的,这是可能的,因为 Vulkan 实现正在为您分配 VkInstance。你不需要知道它包含什么,你只需要一个句柄就可以与 Vulkan 函数一起使用。
猜你喜欢
  • 1970-01-01
  • 2013-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-16
  • 2018-01-14
  • 2021-12-07
相关资源
最近更新 更多