如何在Arduino IDE 1.8.5+中启用C++17

4

我正在制作一个需要 std::variant 的程序,所以显然我需要 C++17,但是在没有编译器标志的情况下,Arduino 并不支持它,我无法弄清楚要使用哪些标志和如何更改编译器标志。 (顺便说一下,我正在使用 Windows,而不是 Linux(虽然我有一台 Linux 笔记本电脑))

我尝试过使用 Arduino boost 库,但它似乎是为 C++ 而不是为 Arduino 编写的,尽管它说是为 Arduino 制作的, 我也尝试过一些变通方法,但它们占用了太多内存。

我希望在 Arduino 中拥有类似 std 或至少等效于 std::variant 的功能,但我还没有找到实现这一点的方法。

谢谢提前!

编辑:如果没有办法在 Arduino 中使用 C++17,则可以有人链接一个使用 C++ 编写 Arduino 板的教程吗?

2个回答

0
Arduino编程语言是C++的一个子集,只有一些小的变化。您可以在项目中引用.CPP和.H文件,只要它们不使用Arduino不支持的C++功能。
我相信总会有人会创造性地找到一种方法将带有C++17功能的代码编译成AVR机器代码(如果他们还没有这样做)。
但请记住,这些是微小的芯片,通常以10-20 MHz的速度运行,并且大约有2 KB的工作内存。标准模板库对于C++来说是一个巨大的飞跃,但在每个字节都很重要时,它可能不是最好的选择。

我已经知道这个问题,但是当我尝试使用 #include <boost/variant.cpp> 或其他类似的语句时,由于缺少一些标准库,它会产生大量错误。我需要在Arduino或C++17的Arduino库中找到std::variant或boost::variant的替代方案。 - PyPylia
1
试试这个:https://github.com/maniacbug/StandardCplusplus 顺便说一句,变体是C++17的标准,不需要使用boost。 然而,我敦促您重新考虑设计决策——因为像variant和any这样的东西并不适合AVR/MCU/低级计算。如果您真的需要这样的功能(但坦白地说:我想知道您为什么要在Arduino中使用它?),我会选择指针和reinterpret_cast——或者更好的是使用memcpy。 - hardyVeles
1
我刚刚偶然看到这个,必须对@hardyVeles提出一个反驳。std::variant对于嵌入式工作来说是一种非常有用的类型。它代表了各种子类型的总和类型,具有紧凑的内存表示,简单的值语义使得编程错误更不可能发生(除了指针),而且与不安全的reinterpret_cast相比,它允许使用get_if进行安全的语义操作。如果你不想使用一种语言的特性,那没问题。但是关于适用性(或者不适用性)的广泛陈述需要一些实际的支持证据。 - deets
1
我刚刚偶然看到这个,必须对@hardyVeles提出一个反驳。std::variant对于嵌入式工作来说是一种非常有用的类型。它代表了各种子类型的总和类型,具有紧凑的内存表示,简单的值语义,使编程错误更不可能发生(除了指针),并且不像不安全的reinterpret_cast,而是允许使用get_if进行安全的语义。如果你不想使用一种语言的特性,那没问题。但是对于适用性(或不适用性)的广泛陈述需要一些实际的支持证据。 - undefined

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接