如何使用C ++ 11编程Arduino?

如何在编程Arduino时使用c++11 ? 我会很好地使用Arduino IDE或其他环境。 我对核心语言改进最感兴趣,而不是需要标准库更改的东西。

版本1.6.6开始 ,Arduino IDE默认启用c ++ 11。

对于旧版本,请阅读:

改变工具链的任何元素( 包括汇编器,编译器 ,链接器或归档器) 的标志是非常容易的

testing了Arduino IDE 1.5.7版(2014年7月发布),

  1. findplatform.txt文件,
    • AVR体系结构=> {安装path} \硬件\ arduino \ avr \ platform.txt
    • SAM体系结构=> {安装path} \ hardware \ arduino \ sam \ platform.txt
  2. 在那个文件里面,你可以改变任何标志 ,例如,
    • compiler.c.flags用于更改C ++文件的默认编译标志。
    • compiler.cpp.flags用于更改C ++文件的默认编译标志。
  3. 您也可以在configuration文件的对应部分,在标题“AVR / SAM编译模式”下更改任何“配方”或编译模式
  4. 进行更改后, 必须重新启动Arduino IDE ,至less在版本1.5.7上。

例如,

要启用对C ++ 11(C ++ 0x)的支持 ,在Arduino IDE 1.5.7和1.5.8版上进行testing,只需在行开始处添加标记“-std = gnu ++ 11”用compiler.cpp.flags =“。

预计在不久的将来 ,Arduino IDE将默认启用C ++ 11。 不过,截至2014年10月的版本1.5.8仍然不是这样。

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从命令行直接avr-gcc ,只需添加一个额外的编译器标志来启用C ++ 11支持。

 -std=c++11 

对于特定的开发环境 ,大多数都支持从IDE中的编译选项编辑编译器标志。 上面提到的标志需要被添加到每个环境的标志列表中。


C++0xC++11标准的工作草案的名称。 C++0x支持可用gcc 4.3以上。 但是,这是严格的实验性支持,所以您不能真正期望C++11function出现。 以下是相应版本的gcc的完整function列表。 avr-gcc的function的可用性将与相应的gcc版本中提供的function相同。

C++0x的编译器标志是:

 -std=c++0x 

请注意,从Arduino IDE指定附加标志或使用其他IDE(Eclipse,代码块等)或命令行没有简单的方法。

作为一个黑客,你可以使用一个小的代理程序(应该是跨平台的):

 //============================================================================ // 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); } 
  1. 编译程序。
  2. 将原始avr-g ++。exe重命名为avr-g ++。orig.exe(或任何其他名称)。
  3. 创buildavr-g ++。ini文件,其中第一行是原始程序的完整path(例如D:\ Arduino \ hardware \ tools \ avr \ bin \ avr-g ++。orig.exe)并添加其他参数,每行一个,如预期的。

你完成了!

示例avr-g ++。ini:

 D:\Arduino\hardware\tools\avr\bin\avr-g++.orig.exe -std=c++0x 

希望,这有帮助!

我用Ino和这工作:

ino build -cppflags="-std=c++0x"

这产生了一个hex文件,至less有15K的大小(开启了优化),相比之下标准版本大约5K,这是一个可怜的小Atmega328的考虑。 对于具有更多程序空间的微控制器之一来说可能是可以的。