【问题标题】:How to check at compile time, whether the C++Standard Library(STL) is supported如何在编译时检查是否支持 C++ 标准库(STL)
【发布时间】: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


【解决方案1】:

新的 C++17 标准具有您正在寻找的 __has_include 功能。 然而,这有点鸡和蛋的问题。如果您的平台不支持 STL,那么对于 c++17 来说它可能已经过时了。

相反,您可能希望依赖于您的构建系统。例如,cmake 可以检测出哪个C++ standard a compiler honors,甚至可以检测出标准的哪一部分。

在您的情况下,如果标准库在该平台上可用,则让构建定义一个临时预处理器常量 HAS_STD_CPP 可能更简单,然后使用 c 预处理器来包含 STL 位,如如https://en.wikipedia.org/wiki/C_preprocessor所示。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-28
    • 1970-01-01
    • 2016-10-01
    • 2017-03-09
    • 2011-06-17
    • 2014-10-22
    • 1970-01-01
    相关资源
    最近更新 更多