如何解决找到一种方法,将 PIMPL 与外部常量定义一起用于实现内部数组的大小
我们有以下情况:我们使用的处理器在其 RAM 中定义了部分,必须由使用 PIMPL 原则的特殊实现使用。例如,私有实现看起来像这样:
Impl( )
{
public:
void doSomething()
{
for( uint32_t i = 0; i < DATA_SIZE; ++i )
{
// do stuff with buf[i]
}
}
private:
static uint8_t buf[DATA_SIZE] __attribute__ ((section("data_buffer"),aligned (8)));
};
如您所见,此处未定义 DATA_SIZE。这里的重点是,我们可以在具有定义“data_buffer”部分的不同链接脚本的同一供应商的不同处理器上使用 Impl 内的处理器供应商提供的函数。这是可能的,因为所使用的底层系统为同一系列的不同处理器提供相同的功能。 但是必须是PIMPL,以保证如果我换到另一个厂商的不同处理器,我们可以使用另一个厂商的另一个Impl。 因此,可能有人使用具有不同 DATA_SIZE 的部分,因为他在他的项目中以不同的方式定义了他的部分(即使在同一处理器上)。 初始化和一切当然会通过构造函数等来完成。
但是是否有可能使 DATA_SIZE 可设置而不是直接在 Impl-File 中定义它?
我知道 PIMPL 的目标是编译它并定义一个 ABI,这对我来说意味着编译后的文件在链接时不能改变大小。我的想法对吗? (对我来说,现在只是快速更改实现,永远不要碰上层的 PIMPL-使用软件部分,但将来我们将使用“pimpl-library”,我们只想更改编译的 Impl-文件。)
我想阻止使用您从中派生的基类/接口类以将实现完全隐藏给开发人员,并且不传递派生类的任何引用或指针,因为这将需要在上层进行软件更改层。
感谢您的意见。
解决方法
但是是否有可能使 DATA_SIZE 可设置而不是直接在 Impl-File 中定义它?
非静态成员数组的大小必须在类定义中设置。
您可以使用预处理器包含来自其他地方的值,因此在这个意义上它不必“在文件中”,但是无论大小是多少,它都必须匹配所有 TU 并更改大小只在私有实现内部而不修改接口的客户端是不可能的..
请注意,只要您将数组定义为至少是指针的大小和对齐方式,那么您就可以使用间接实现私有实现中的任何数据 - 通过存储指针并在动态存储中创建具体对象。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。