Release 2017.4.30 / Update 2017.6.18

スケッチがコンパイルできない時 2 ライブラリの読み込み

Arduino IDEでライブラリを使用する時の#inlucde表記には違いがあります。

昔書いたスケッチをベースにして、ちょっとテストしてみようとして、他のライブラリも取り込んだときにコンパイルエラーが出て、今更気付きました。

“”で括られたものと、<>で括られたものがあります。

u8glibのサンプルスケッチはみんな””表記になっています。が、後継ライブラリのu8g2は<>表記だったり…。

u8glibはサンプル自体をコピペしてベースにしてたので、基本、書きませんでしたし、メニューから「ライブラリをインクルード」する方法でも勝手に書き足されるので、書く必要はありませんでした。

ちなみにメニューから#includeだと<>になります。

確かに白紙からスケッチ描くときに「どうだっけ?」って思ったこともあった気がしますが、実際は、どちらで書いてもほぼ支障なくコンパイルしてくれます。

でも、こうなると気持ち悪いので調べてみると、どうやら表記によって意味合いが微妙に違うことを知りました。

#includeの意味(C/C++)

もう少し具体的に言及しているものがあります。

#include ディレクティブ (C/C++)

どうやらライブラリを見つけに行く方法が変わってくるようです。学校などでプログラミングを基本から学んでいる人には、「当たり前だろ」と言われそうですが(苦)。

まとめると、以下のようなことになります。

最新IDEは1.8.2(2017/4/30 現在)です。
#include “U8glib.h” 相対パスを辿っていき、ライブラリを探す
#include <U8glib.h> IDEで指定されているパス内からライブラリを探す

例えるなら、家系図から「まりこ」という名前を探すのに、

祖父から順に父親の血筋を辿り、その兄弟を辿り、その子供を辿ったら“いとこ”に「まりこ」がいた。これが””括り。

対して、最初から「叔父の子供から探せ」と指定されてるのが<>括り。

“”は全てチェックしていくから時間がかかるようで、基本<>で括っておけば問題ないと思われます。が、万が一、“まりこ”が叔父の隠し子だった場合、認識してませんと表立っては弾かれてしまうので、総当たりで探る””の方がいい場合もあり…ってあんまいい例え方ではないですね、これ。

 

実は、この表記違いは「一回コンパイルエラーが出て、原因を探ったら気付いた」という経緯があります。ただ、もうエラーは出ません。上記の意味合いから、何かしら一時的にディレクトリがアクセス出来なかったからかなぁと推測したりしていますが…。

結局、以前の「関数の順番問題」と一緒で、理由がはっきりしないんですが、環境によって同様なトラブルが起こる可能性もありえます。そんな時は、この#include部分の変更で解決するかもしれません。

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください