gpt4 book ai didi

c++ - C 接口(interface)中句柄的正确类型

转载 作者:IT老高 更新时间:2023-10-28 22:35:37 24 4
gpt4 key购买 nike

我正在创建一个在 DLL 文件中隐藏某些功能的 C api。

由于内部的一切都是 C++,因此大多数函数都针对直接映射到 API 内部的 this 指针的句柄工作。

为了对这些句柄进行某种程度的类型安全,我这样定义它们:

typedef struct MyType1* MyType1Handle;
typedef struct MyType2* MyType2Handle;

我实际上并没有在任何地方定义 MyType1 或 MyType2,因为我只将它们用作指针并在 api 内部对实际指针类型进行类型转换。

我的问题是,在 Visual Studio 的 clr 项目中使用我的库时,我收到此 warning: unresolved typeref token (token) for 'type';图像可能无法运行。

http://msdn.microsoft.com/en-us/library/h8027ys9(VS.80).aspx

这没什么大不了的,因为它有效,但它看起来不专业。

我不喜欢使用 void*:

typedef void* MyType1Handle;
typedef void* MyType2Handle;

这使得调用需要 MyType1Handle 和 MyType2Handle 的函数成为可能,因为它们实际上是相同的类型。

我不想使用的另一种方法是这样的

typedef int MyType1Handle;
typedef int MyType2Handle;

只要 int 和指针具有相同的大小,这将正常工作,但情况并非总是如此,而且似乎没有万无一失的方法来获取特定于平台的指针大小的整数。它也有与 void* 相同的类型安全问题。

我尝试的另一种方法是这样做:

struct MyType1{};
typedef struct MyType1* MyType1Handle;

这在 C 中不起作用,因为空结构是无效的 C 代码。我当然可以用一个虚拟成员来扩展我的结构,但似乎应该有更好的方法来做到这一点。

所以我的问题归结为:

您通常如何以最兼容的方式指定这种类型?

最佳答案

如果您查看 Microsoft 如何定义它的 winapi 句柄 (winnt.h),它实际上看起来像这样:

struct HWND__ { int unused; }; typedef struct HWND__ *HWND

事实上他们有一个宏:

#define DECLARE_HANDLE(name) struct name##__{int unused;}; typedef struct name##__ *name

所以.. 这似乎是一种常见的做法。不幸的是,除了这个你已经提出的建议之外,我无法提出其他建议提到了,但我希望它对你有帮助。

关于c++ - C 接口(interface)中句柄的正确类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/839765/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com