【发布时间】:2013-04-19 22:30:12
【问题描述】:
在 Arduino 编程时如何使用C++11?
我可以使用 Arduino IDE 或其他环境。我最感兴趣的是核心语言的改进,而不是需要更改标准库的事情。
【问题讨论】:
在 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 月)开始,情况仍然不是这样。
【讨论】:
-std=gnu++11 标志。在这里你可以看到提交Enable C++11 support: github.com/arduino/Arduino/commit/ddf4d878fdb39173b872f69149fb4cf1cd9fd017。这里也提到了stackoverflow.com/a/33718020/1338846
C:\Program Files (x86)\Arduino\hardware\arduino\avr
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 不支持自定义编译器标志。这是requested,但尚未实现。
因此,您不得不使用其他环境或直接从命令行编译程序。
如果使用 AVR-GCC 从命令行直接编译,您只需添加一个额外的编译器标志即可启用 C++11 支持。
-std=c++11
对于特定的development environments,大多数支持从 IDE 中的构建选项编辑编译器标志。上述标志需要添加到每个环境的标志列表中。
C++0x 是 C++11 标准工作草案的名称。 GCC 4.3 及更高版本提供 C++0x 支持。但是,这是严格的实验性支持,因此您不能可靠地期望 C++11 功能存在。 Here 是相应版本的 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。在 Properties 窗口中,选择 Arduino → Compiler 选项。这样您就可以在构建中添加选项。
【讨论】: