相关疑难解决方法(0)

C接口中句柄的正确类型

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

由于内部的所有内容都是C++,因此大多数函数都可以处理直接映射到API内部的指针的句柄.

为了获得这些句柄的某种程度的类型安全性,我将它们定义为:

typedef struct MyType1* MyType1Handle;
typedef struct MyType2* MyType2Handle;
Run Code Online (Sandbox Code Playgroud)

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

我的问题是,当我在Visual Studio的clr项目中使用我的库时,我得到了这个 warning: unresolved typeref token (token) for 'type'; image may not run.

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

它起作用并没什么大不了的,但看起来不专业.

我不喜欢使用void*:

typedef void* MyType1Handle;
typedef void* MyType2Handle;
Run Code Online (Sandbox Code Playgroud)

这使得可以调用想要MyType1Handle和MyType2Handle的函数,因为它们实际上是相同的类型.

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

typedef int MyType1Handle;
typedef int MyType2Handle;
Run Code Online (Sandbox Code Playgroud)

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

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

struct MyType1{};
typedef struct MyType1* MyType1Handle;
Run Code Online (Sandbox Code Playgroud)

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

所以我的问题归结为:

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

c c++ api

15
推荐指数
2
解决办法
2104
查看次数

C中的空结构与C++中的空结构

为什么C中的空结构违反约束?为什么在C++中更改此规则?

有历史原因吗?

c c++ struct rationale

7
推荐指数
1
解决办法
2003
查看次数

C++'struct'和'class'之间的所有区别?

可能重复:
C++中struct和class之间有什么区别

使用只有 C++类之间的差异是私营的默认类成员访问修饰符和悠闲的出样-C的保证.

事实证明我错了,因为这段代码不能编译:

class { int value; } var = { 42 };
Run Code Online (Sandbox Code Playgroud)

这样做:

struct { int value; } var = { 42 };
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚为什么会有区别,但显然在Visual C++ 2008中:

错误C2552 :: 'var'无法使用初始化列表初始化非聚合

所以,是的,我会问多次重复的问题(希望没有重复的答案!):

什么是所有的C++结构和类之间的区别是什么?

当然,如果你发现我在其他问题上遗漏了一些东西,我可以随意关闭它 - 我当然可以.但我没有看到在任何答案中都讨论过这个问题,所以我想我会问.

c++ struct class

6
推荐指数
1
解决办法
1956
查看次数

标签 统计

c++ ×3

c ×2

struct ×2

api ×1

class ×1

rationale ×1