Arduino C ++コード:仮想関数と例外を使用できますか?
-
19-08-2019 - |
質問
質問
Arduino プラットフォーム用のC ++コードをコンパイルする場合、仮想関数、例外などを使用できますか?または、で説明されているように、C ++のサブセットを使用する必要がありますかコメント)?
Arduinoプラットフォーム用にプログラミングする際のその他の注意事項はありますか?
解決
Arduino環境では、GCCツールチェーンのAVRバージョンを使用しています。コードはC ++としてコンパイルされるため、クラスを使用できます。仮想機能が可能です。 vtableは.dataセクションに保存され、正しいアドレスを持ちます。実際、Print基本クラスは仮想関数を使用して、さまざまな<!> quot; print <!> quot;を調整します。さまざまな出力タイプへのメソッド。
コードスペースの理由により、例外はサポートされていません。 Arduino環境は<!> quot; -fno-exceptions <!> quot;を渡します。コンパイラのコマンドラインに。この検証については、ソースをご覧ください。 。
テンプレートがサポートされています。たとえば、この無料のストリーム挿入演算子テクニックは、単純なテンプレートとインライン演算子を使用して正常に機能します。
他のヒント
Arduinoソフトウェアはavr-gccを使用してスケッチをコンパイルします。次の制限は、 avrlibc FAQ(C ++を使用できますか? AVR?):
サポート
- 仮想関数
- コンストラクタとデストラクタ(グローバルなものを含む)
サポートされていません
- C ++標準関数、クラス、およびテンプレートクラス(ただし、 Arduino用uClibc ++のこのポートを参照)
- 演算子
new
およびdelete
(それらを使用しようとすると、リンカーは未定義の外部参照について文句を言います)。つまり、オブジェクトはスタック上でのみ作成できます。動的メモリ割り当てが必要な場合、malloc()
およびfree()
タイプのC
を使用して実装する必要があります - 例外。 C ++フロントエンドではデフォルトで例外が有効になっているため、コンパイラオプションで
-fno-exceptions
を使用して例外を明示的にオフにする必要があります。これはArduino IDEがavr-gcc
を起動したときに自動的に行われます
その他の問題
- 提供されているインクルードファイルの一部はC ++に対応していません。つまり、
extern "C" { . . . }
でラップする必要があります。
機能の使いやすさはプラットフォームによって制限されるのではなく、使用しているコンパイラによって制限されます。
サポートされている言語機能については、コンパイラのドキュメントを確認します。
Comeau Computing には、すべてのC ++機能をサポートするC ++ to Cコンパイラがあります。仮想関数や例外だけでなく、エクスポートもできます。 Arduino言語をターゲットにするためにComeauを呼び出す必要がありますが、それほど難しくないはずです。
ドキュメントによると:
Arduino言語はC / C ++に基づいており、すべての標準C構成体といくつかのC ++機能をサポートしています。
見つけることができる仮想関数については何も言っていません。
簡単なプログラムを試してみましたが、問題なくコンパイルできます。ただし、Arduinoハードウェアではテストしていません。
編集:例外もテストしていません。
g ++をこのMakefile で使用し、このコード。 C ++はスペースを浪費します。しかし、プロトスレッドはあまりにもクールなので使用しないでください。