どうすれば_c++11
Arduinoをプログラミングするとき? Arduino IDEまたは別の環境を使用しても構いません。標準ライブラリの変更を必要とするものではなく、コア言語の改善に最も興味があります。
バージョン1.6.6 の時点で、Arduino IDEはデフォルトでc ++ 11を有効にします。
古いバージョンについては、次をお読みください。
ツールチェーンの任意の要素のフラグを変更するのは非常に簡単です。アセンブラ、コンパイラ、リンカまたはアーカイバを含みます。
Arduino IDEバージョン1.5.7(2014年7月にリリース)、
例えば、
Arduino IDEバージョン1.5.7および1.5.8でテスト済み)でC++ 11(C++ 0x)のサポートを有効にするには、 compiler.cpp.flags = "で始まる行の最後にフラグ" -std = gnu ++ 11 "を追加するだけです。
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はカスタムコンパイラフラグをサポートしていません。これは requested ですが、まだ実装されていません。
そのため、他の環境を使用するか、コマンドラインからプログラムを直接コンパイルする必要があります。
avr-gcc
を使用してコマンドラインから直接コンパイルする場合、C++ 11サポートを有効にするためのコンパイラフラグを追加するだけです。
-std=c++11
特定の 開発環境 の場合、ほとんどはIDE内のビルドオプションからコンパイラフラグの編集をサポートします。上記のフラグは、各環境のフラグのリストに追加する必要があります。
C++0x
は、C++11
標準の作業ドラフトの名前でした。 C++0x
サポートはgcc
4.3以降で利用可能です。ただし、これは厳密に実験的なサポートであるため、C++11
機能が存在することを実際に期待することはできません。 ここ は、対応するバージョンのgcc
で利用可能な機能の完全なリストです。 avr-gcc
で利用できる機能は、対応するgcc
バージョンで利用できるものと同じです。
C++0x
のコンパイラフラグは次のとおりです。
-std=c++0x
私は Ino を使用し、これはうまくいきました:
ino build -cppflags="-std=c++0x"
これにより、標準のビルドの約5kに比べて、サイズが少なくとも15k(最適化がオンになっている)の16進ファイルが生成されました。これは、貧しい小さなAtmega328の考慮事項です。より多くのプログラムスペースを持つマイクロコントローラの1つで大丈夫かもしれません。
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);
}
できました!
例avr-g ++。ini:
D:\Arduino\hardware\tools\avr\bin\avr-g++.orig.exe
-std=c++0x
希望、それが役立ちます!