【问题标题】:C++ link time resource "allocation" without defines没有定义的 C++ 链接时间资源“分配”
【发布时间】:2020-02-03 15:17:39
【问题描述】:

我目前正在为 ESP32 开发 C++ 类。我想实现资源的资源分配,例如:IO-Pins、可用的 RMT 通道等。 我的想法是使用某种资源处理程序来执行此操作,该处理程序会在编译时检查它,但我没有好主意,也没有找到任何类似的东西。

为了澄清我的问题,让我们举一个例子来说明我的意思。 微控制器 X 有 1-5 个 IO 引脚,每个引脚只能由一个组件使用。

组件不知道彼此之间的任何信息,它们应该将引脚用作 ctor 参数。 现在我想要一个类/方法/...来检查组件需要的引脚是否已经在编译时分配。

CompA a(5); //works well: 5 is not in use
CompB b(3); //same as before, without the next line it should compile
CompC c(5); //Pin 5 is already in use: does not compile!

我还不知道该怎么做。我最好的猜测(因为我不能在这里使用定义:用户应该只能通过提供参数或模板参数来使用它)是,它可能与模板函数一起使用,但我没有找到任何方法来检查哪个其他参数已传递给模板方法/类。

Edit1:程序的某些部分可能是自动生成的,也可能是用户以某种方式定义的,他们不知道其他引脚的使用情况。因此,分配是一个“安全”特性,应该禁止错误代码。如果寄存器函数位于不同的代码路径中(即使它们可能相互排斥),这也应该禁止它

Edit2:我收到了回复,这里的编译时间是错误的,因为组件可能会与另一个组件分开编译。所以这样做的唯一方法似乎是链接器错误。

【问题讨论】:

  • 您想为每个组件使用不同的类吗?就像你的例子一样。
  • 是的。想象一下两个完全不同的组件,例如用于智能 LED 的 LED 驱动器和 1-Wire 驱动器。由于某些导致无效代码的原因,两个组件都希望使用相同的硬件引脚,这显然是不可能的。当我正在开发一个生成代码的物联网框架时,可能会发生这样的事情。我不希望硬件损坏并出现运行时错误,而是为了方便起见编译时错误。

标签: c++ templates linker resources compile-time-type-checking


【解决方案1】:

一个愚蠢的C 风格的方法:你可以拼命地使用__COUNTER__ 作为构造函数的参数。此动态宏在每次出现后都会自行增加,从 0 开始。

我希望有更好的解决方案。

【讨论】:

  • 有趣的想法,但这并不意味着组件不仅需要以正确的顺序调用,而且不能使用“随机”引脚号。如果 compA 想使用 Pin 3,compB Pin 2 而没有人需要 Pin 1,那就不行了。
  • @FenBerlind 这很麻烦,不过您可以尝试使用一些“奇数”__COUNTER__“呼叫”来跳过某些数字。
  • 即使认为这可能以某种方式起作用,我想以这种方式使用它并不是一个好主意,因为它会使编码更加复杂(必须牢记顺序)并且可能使用使用 ___COUNTER___ 的库时会中断。
猜你喜欢
  • 2017-07-31
  • 1970-01-01
  • 1970-01-01
  • 2012-12-01
  • 1970-01-01
  • 2020-11-26
  • 2022-09-27
  • 1970-01-01
  • 2023-04-03
相关资源
最近更新 更多