如何编组从 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 头文件中的宏定义的结构?的主要内容,如果未能解决你的问题,请参考以下文章

c语言的宏定义 if defined

C如何防止头文件中的结构体被重复定义?

如何将系统环境变量作为宏定义放入 C 头文件?

如何避免与 Windows 头文件中定义的宏发生名称冲突?

C语言头文件中定义结构体的问题

C语言中头文件errno.h是啥含义?包含些啥内容?