最終更新日:
2013年1月17日
Arduinoでのtypedefの使い方
Arduinoのスケッチ内でtypedefを使う場合、ちょっと注意が必用です。
定義されていないことになってしまう
Arduinoのプログラミングは基本的にはc(c++)ですが、厳密にはcよりも若干「ゆるい」ところがあります。例えば各関数のプロトタイプは不要だったり(IDEが勝手にやってくれる)。それに甘えてしまうと悩んでしまうのがtypedef。
例えば以下のスケッチ(意味はありません)。Arduino的には問題ないように見えますが、「testTypeが宣言されていない」というエラーになってしまいます。
Sketch
typedef int testType; void setup() { testFunc(0); } void loop() { } int testFunc(testType n) { }
原因は、ArduinoのIDEが関数のプロトタイプを自動的に作成する点にあります。上記スケッチから作成されたc++のソースは以下。
Sketch.cpp
#line 1 "sketch_xxxxxxx.ino" #include "Arduino.h" void setup(); void loop(); int testFunc(testType n); ←自動的に追加されたプロトタイプ #line 2 typedef int testType; void setup() { testFunc(0); } void loop() { } int testFunc(testType n) { }
つまり、typedefよりも前にその型を使った関数のプロトタイプを作成してしまうためです。
ということで解決策は、まずは自分でプロトタイプを書けばOK。もちろんtypedefの後に。
Sketch
typedef int testType; int testFunc(testType n); ←自分でプロトタイプを書いておく void setup() { testFunc(0); } void loop() { } int testFunc(testType n) { }
スケッチ上にプロトタイプが書かれていればその関数のプロトタイプは自動的に追加されなくなります。
または、typedefの部分を別のヘッダファイルに記載し、それをインクルードしてもOKです。自動的に追加されるプロトタイプは#includeの後なので、これでもOKになります。