【发布时间】: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