如何在编译时检查是否支持C++标准库(STL)

如何在编译时检查是否支持C++标准库(STL),c++,compilation,stl,compile-time,C++,Compilation,Stl,Compile Time,我正在抽象多个微控制器上的中断处理。 臂皮质M-3/4区确实非常支持STL,但 ATMEGA328 P的使用非常广泛,不支持C++ STL。 除了基本的C风格函数指针之外,我还想提供使用std::函数为特定中断注册回调的可能性。 我还没有测试过,但是告诉我们,C++ LAMBDAS可以与简单的函数指针相比,做很多事情,尤其是在捕获变量和引用时。 我想更改定义头classif-required和实现classesif-required,可能没有必要,因为实现将丢失,以便在编译时删除成员函数定义,具

我正在抽象多个微控制器上的中断处理。 臂皮质M-3/4区确实非常支持STL,但 ATMEGA328 P的使用非常广泛,不支持C++ STL。 除了基本的C风格函数指针之外,我还想提供使用std::函数为特定中断注册回调的可能性。 我还没有测试过,但是告诉我们,C++ LAMBDAS可以与简单的函数指针相比,做很多事情,尤其是在捕获变量和引用时。 我想更改定义头classif-required和实现classesif-required,可能没有必要,因为实现将丢失,以便在编译时删除成员函数定义,具体取决于控制器是否支持STL。 我想知道C++是否提供了这样的测试,或者如果某种方式可以通过包括STL头和某种方式测试,是否包含失败或者?
...

#include <functional>

class InterruptVectorTable
{
    bool setCallback(ValueType InterruptNumber, void (*Callback)(void));
    bool setCallback(ValueType InterruptNumber, std::functional<void(void)> Callback);
}

如果不允许同时使用这两个定义,那么我最好使用std::函数。

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

相反,您可能希望依赖于构建系统中的一个组件。例如,cmake可以检测实现了标准的哪一部分,甚至哪一部分


在您的情况下,如果标准库在该平台上可用,则让构建定义一个特殊的预处理器常量HAS_STD_CPP,然后使用c预处理器包含或不包含STL位可能会更简单,如所示。

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

相反,您可能希望依赖于构建系统中的一个组件。例如,cmake可以检测实现了标准的哪一部分,甚至哪一部分


在您的情况下,如果标准库在该平台上可用,让构建定义一个特殊的预处理器常量HAS_STD_CPP,然后使用c预处理器包含STL位或不包含STL位可能会更简单,如中所示。

您使用哪种编译器?我想,这是不同的编译器,我使用的是ePlatformIO IDE,这一点隐藏了实际的编译器。我认为ARM Cortex编译器是ARM gcc,ATmega编译器是avr gcc编译器。我指的是C++标准库的用法,它包含STL。并希望在编译时测试是否可以在编译时包含来自该库的头,如果可以包含头,则相应地更改定义@Richard Criten一般来说,编译器/库应该定义和,因为C++17有,但是不能保证头文件中有任何内容。它们是否在这个环境中是可用的,我不知道。C++特性的支持是编译器的特性,而不是微控制器的特性。AtMEGA328 P执行机器指令,而不是C++代码。你使用哪一个编译器?那些是不同的编译器,我想,我使用TeaPiPrimoIide,这有点隐藏了实际编译器。我认为ARM Cortex编译器是ARM gcc,ATmega编译器是avr gcc编译器。我指的是C++标准库的用法,它包含STL。并希望在编译时测试是否可以在编译时包含来自该库的头,如果可以包含头,则相应地更改定义@Richard Criten一般来说,编译器/库应该定义和,因为C++17有,但是不能保证头文件中有任何内容。它们是否在这个环境中是可用的,我不知道。C++特性的支持是编译器的特性,而不是微控制器的特性。ATMEGA328 P执行机器指令,而不是C++代码。