如何编组从C头中的宏定义的结构?

时间:2016-10-07 13:27:00

标签: c# c++ pinvoke marshalling vulkan

对于使用C#使用Vulkan API header file的{{3}}的下一部分,我不知道热议:

#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;

2 个答案:

答案 0 :(得分:2)

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

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

会扩展到

typedef struct VkInstance_T* VkInstance;

答案 1 :(得分:1)

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

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

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