对 Arduino 进行编程时如何使用C++11 ?
我可以使用 Arduino IDE 或其他环境。我最感兴趣的是核心语言的改进,而不是需要更改标准库的东西。
从版本 1.6.6开始,Arduino IDE 默认启用 C++11。
对于旧版本,请继续阅读:
更改工具链任何元素的标志非常容易,包括汇编器、编译器、链接器或存档器。
在 Arduino IDE 版本 1.5.7(2014 年 7 月发布)上测试,
例如,
要启用对 C++11 (C++0x)的支持,在 Arduino IDE 版本 1.5.7 和 1.5.8 上测试,您只需在行尾添加标志“-std=gnu++11”开始与 compiler.cpp.flags=".
预计在不久的将来会在 Arduino IDE 上默认启用 C++11。但是,从 1.5.8 版(2014 年 10 月)开始,情况仍然并非如此。
Arduino IDE 1.6.6 和更新版本默认启用 C++11(它们在 platform.txt 文件中设置了编译器标志“-std=gnu++11”)。
首先,只有 GCC 4.7 及更高版本(因此 AVR-GCC 4.7 及更高版本)支持 C++11。因此,检查安装的版本:
gcc --version
avr-gcc --version
如果 AVR-GCC 是 4.7 或更高版本,那么您也许可以使用 C++11。
Arduino IDE 不支持自定义编译器标志。这已被请求,但尚未实施。
因此,您不得不使用其他环境或直接从命令行编译程序。
如果使用 AVR-GCC 直接从命令行编译,您只需添加一个额外的编译器标志即可启用 C++11 支持。
-std=c++11
对于特定的开发环境,大多数支持从 IDE 中的构建选项编辑编译器标志。需要将上述标志添加到每个环境的标志列表中。
C++0x是 C++11 标准工作草案的名称。GCC 4.3 及更高版本提供 C++0x 支持。但是,这是严格的实验性支持,因此您不能可靠地期望 C++11 功能存在。以下是相应版本的 GCC 可用功能的完整列表。AVR-GCC 中功能的可用性将与相应 GCC 版本中的功能相同。
C++0x 的编译器标志是:
-std=c++0x
请注意,没有简单的方法可以从 Arduino IDE 指定其他标志或使用其他 IDE(Eclipse、Code::Blocks等)或命令行。
作为 hack,您可以使用一个小型代理程序(应该是跨平台的):
//============================================================================
// Name : gcc-proxy.cpp
// Copyright : Use as you want
// Description : Based on http://stackoverflow.com/questions/5846934/how-to-pass-a-vector-to-execvp
//============================================================================
#include <unistd.h>
#include <iostream>
#include <vector>
#include <fstream>
using namespace std;
int main(int argc, char *argv[]) {
vector<string> arguments;
vector<const char*> aptrs;
// Additional options, one per line
ifstream cfg((string(argv[0]) + ".ini").c_str());
if (cfg.bad())
cerr << "Could not open ini file (you're using proxy for some reason, er?)" << endl;
string arg;
while (cfg) {
getline(cfg, arg);
if(arg == "\r" || arg == "\n")
continue;
arguments.push_back(arg);
}
for (const string& arg : arguments)
aptrs.push_back(arg.c_str());
for (int i = 1; i < argc; ++i)
aptrs.push_back(argv[i]);
// Add null pointer at the end, execvp expects NULL as last element
aptrs.push_back(nullptr);
// Pass the vector's internal array to execvp
const char **command = &aptrs[0];
return execvp(command[0], command);
}
你完成了!
示例avr-g++.ini:
D:\Arduino\hardware\tools\avr\bin\avr-g++.orig.exe
-std=c++0x
如果您需要更多控制和更好的 IDE,我建议使用 Sloeber Plugin for Eclipse或 Sloeber IDE 本身。
使用此 IDE 创建更复杂的代码要容易得多。它还允许向编译器(C、C++ 和链接器)添加标志。因此,要自定义编译,只需右键单击项目并选择Properties。在属性窗口中,选择Arduino → 编译器选项。这样您就可以在构建中添加选项。