0

我们有以下情况:我们正在使用在其 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。这里的重点是,我们可以在同一供应商的不同处理器上使用 Impl 中的处理器供应商提供的函数,并使用不同的链接脚本定义“data_buffer”部分。这是可能的,因为使用的底层系统为同一家族的不同处理器提供了相同的功能。但它必须是一个 PIMPL 来保证如果我更换到另一个供应商的不同处理器,我们可以为另一个供应商使用另一个 Impl。因此,可能有人正在使用具有不同 DATA_SIZE 的部分,因为他在他的项目中以不同的方式定义了他的部分(即使在同一个处理器上)。初始化和一切当然将通过构造函数等完成。

但是是否可以使 DATA_SIZE 可设置而不是直接在 Impl-File 中定义它?

据我所知,PIMPL 的目标是编译它并定义一个 ABI,这对我来说意味着编译后的文件在链接后不能改变大小。我的想法对吗?(对我来说,现在只是快速更改实现,永远不要接触上层使用 PIMPL 的软件部分,但我们将来会使用“pimpl-library”,我们只想更改编译后的 Impl-文件。)

我想防止使用派生的基类/接口类来完全隐藏对开发人员的实现,并且不传递派生类的任何引用或指针,因为这需要在上层进行软件更改。

谢谢你的想法。

4

1 回答 1

1

但是是否可以使 DATA_SIZE 可设置而不是直接在 Impl-File 中定义它?

非静态成员数组的大小必须在类定义中设置。

您可以使用预处理器包含来自其他地方的值,因此它不必在这个意义上“在文件中”,但是无论大小是什么,它都必须匹配所有 TU 并且仅在不修改接口客户端的私有实现是不可能的..


请注意,只要您将数组至少定义为指针的大小和对齐方式,那么您就可以使用间接实现私有实现中的任何数据 - 通过存储指针并在动态存储中创建具体对象。

于 2021-02-17T16:46:52.120 回答