【发布时间】:2020-03-08 04:37:52
【问题描述】:
我正在抽象多个微控制器上的中断处理。
ARM Cortex M-3/4 确实非常支持 STL,但是
ATMega328p(被大量使用)不支持 C++ STL。
除了基本的 C 风格函数指针之外,我还想提供使用 std::function 为特定中断注册回调的可能性。
我还没有测试过,但有人告诉我,与简单的函数指针相比,C++ lambda 可以做很多事情,尤其是在捕获变量和引用时。
我想更改定义头类(如果需要)和实现类(如果需要,可能没有必要,因为实现将完全丢失),以便在编译时删除成员函数定义,具体取决于关于控制器是否支持 STL。 我想知道 C++ 是否提供了这样的测试,或者是否可以通过包含 STL 标头并以某种方式测试来做到这一点,包括是否失败?
...
#include <functional>
class InterruptVectorTable
{
bool setCallback(ValueType InterruptNumber, void (*Callback)(void));
bool setCallback(ValueType InterruptNumber, std::functional<void(void)> Callback);
}
如果两个定义都不允许同时使用,那么我希望最好使用std::function。
【问题讨论】:
-
你使用哪个编译器?
-
我猜这些是不同的编译器,我使用的是 ePlatformIO “IDE”,它有点隐藏了实际的编译器。我认为 ARM Cortex 编译器是 arm-gcc,而 ATmega 编译器是 avr-gcc。我指的是包含 STL 的 C++ 标准库的使用。并且想在编译时测试是否可以在编译时包含该库中的头文件,如果可以包含头文件,则相应地更改定义。 @Richard Critten microchip.com/webdoc/AVRLibcReferenceManual/…
-
通常编译器/库应该定义 feature test macros 并且由于 C++17 有
__has_include但不能保证标头中有任何内容文件。它们在这种环境下是否可用,我不知道。 -
对 C++ 功能的支持是编译器的属性,而不是微控制器的属性。 ATMega328p 执行机器指令,而不是 C++ 代码。
标签: c++ compilation stl compile-time