如何编组从 C 头文件中的宏定义的结构?
Posted
技术标签:
【中文标题】如何编组从 C 头文件中的宏定义的结构?【英文标题】:How to marshall struct defined from macros in C header? 【发布时间】: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 谢谢 :) 太好了 【参考方案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 函数一起使用。以上是关于如何编组从 C 头文件中的宏定义的结构?的主要内容,如果未能解决你的问题,请参考以下文章