C++;不透明数据类型的属性 我正在构建一个C++ API,它需要扩展而不需要重新编译使用它的软件(因为很多不好的原因)。这需要不透明的数据类型,以便可以将字段添加到类中。差不多 struct CheshireCat; // Not defined here std::unique_ptr<CheshireCat> d_ptr;

C++;不透明数据类型的属性 我正在构建一个C++ API,它需要扩展而不需要重新编译使用它的软件(因为很多不好的原因)。这需要不透明的数据类型,以便可以将字段添加到类中。差不多 struct CheshireCat; // Not defined here std::unique_ptr<CheshireCat> d_ptr;,c++,stl,binary-compatibility,C++,Stl,Binary Compatibility,但是我看不到这样的MyInt访问包含类中CheshireCat指针的任何好方法,更不用说结构中的隐藏属性了 这似乎是一个非常常见的问题,所以我正在寻找其他人的聪明解决方案。可能使用了一些模糊的宏观学 (备选方案是1.忘记二进制兼容性,或2.手工编写大量样板代码。) 我意识到,为了实现二进制兼容性,需要在末尾添加新的虚拟方法。Mangling依赖于编译器,但对于给定的编译器应该是稳定的(我们将提供针对特定编译器/版本的二进制文件) 这感觉像C++ 101,但我找不到任何能优雅地解决它的东西。(我的

但是我看不到这样的MyInt访问包含类中CheshireCat指针的任何好方法,更不用说结构中的隐藏属性了

这似乎是一个非常常见的问题,所以我正在寻找其他人的聪明解决方案。可能使用了一些模糊的宏观学

(备选方案是1.忘记二进制兼容性,或2.手工编写大量样板代码。)

我意识到,为了实现二进制兼容性,需要在末尾添加新的虚拟方法。Mangling依赖于编译器,但对于给定的编译器应该是稳定的(我们将提供针对特定编译器/版本的二进制文件)


这感觉像C++ 101,但我找不到任何能优雅地解决它的东西。(我的背景是Java/NET/LISP,java解决了这个问题。C++ C++系统完成了(DLL)链接器中的最后编译阶段,这是很好的,但遗憾的是它不是这样的。”

< P>我不认为你可以通过暴露C++ +< /P>来获得二进制兼容性。 您可以做的是公开一个C接口(它是二进制兼容的)。这意味着,正如您所暗示的,公开处理不透明句柄(即指针)的函数


当然,内部结构可以用C++编写。

我认为,在实践中,如果使用相同的C++编译器/版本、不透明的数据类型,并且只在最后添加虚拟方法,那么就可以获得二进制兼容性。(最后一个要求是奇怪的,但是C++编译器似乎不为虚拟方法创建链接符号,只是硬编码偏移量)。我不想依赖于将来可能发生变化的实现细节,我不知道你在哪里解释了pimpl习惯用法的问题。getter/setter不是问题。。。
int & operator = (const int &i) { return value = i; }
operator int () const { return value; }