我正在创建一个隐藏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++中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'
无法使用初始化列表初始化非聚合
所以,是的,我会问多次重复的问题(希望没有重复的答案!):
当然,如果你发现我在其他问题上遗漏了一些东西,我可以随意关闭它 - 我当然可以.但我没有看到在任何答案中都讨论过这个问题,所以我想我会问.