- Xcode で C++ で開発してたら、ヘッダサーチパス以外にあるヘッダもパスなしでインクルードできる事に気付いた。キモイ。
- Xcode はよくても他のコンパイラでエラーになるし、意図しないヘッダがインクルードされたりもはや迷惑。この機能切りたい。
うっかり string.h
C / C++ のヘッダって、コンパイラオプションでヘッダサーチパスを指定しておけば、そのパスにあるヘッダは
#include <mylib.h>
って感じでパスなしでインクルードできるけど、それ以外のファイルは自分からの相対パスでインクルードするのが普通。
で、ヘッダサーチパスに直接置くヘッダについては他のライブラリと被らないような名前にするけど、サブディレクトリのヘッダはあんま気にする必要もないんで、ついうっかり string.h とか安易な名前のヘッダを作ってしまったんだけど、 そのヘッダを Xcode に追加した途端、急に訳の分からんエラーが出まくりだした。
しかもヘッダをプロジェクトに追加せずインクルードする分には問題ないのに、プロジェクトに追加した途端エラーが出まくるという。また Xcode が余計な事をしてる予感。
Header Maps というらしい
答えを先に言ってしまうと、Xcode の Build Setting に Use Header Maps というのがあって、これが Yes なら、プロジェクトに追加したヘッダファイルについてはパス指定なしにヘッダ名だけでインクルードできる んだそうな。C の常識を覆す画期的な機能すね。
そして迷惑な事に、新規プロジェクトの時点でデフォルトで Yes。さあ切ろう!
この機能のせいで、例えば string.h とか、システムヘッダと名前が被るヘッダをうっかり作ってしまうと、プロジェクトにそれを含めた途端にシステムヘッダよりも優先的にインクルードされるようになり、急に意味不明なエラーが出まくる、と。
あと、プロジェクト内に同名のヘッダが複数ある場合もかなり罠になりそう。
まあもちろん、そもそも名前が被るヘッダなんて作んなって話なんだけど、本来の C のルールなら問題ないんだからデフォルトで Yes はやめてくんないかね。