☆テクニカルQ&A

コンパイラのビルトインマクロ(定義済み定数)を調べる


  1. ターミナルを起動する。見つからないときはspotlightで「ターミナル」と打ち込んで検索して実行
  2. 「cpp -dM /dev/null」と打ち込んでEnter。「cpp -dM /dev/null | sort」の方がソートされるので読みやすいかも。
ただ、余り有益なのはなさそう。 コンパイル条件(Device/Simulatorとかアクティブな構成等)を知りたかったのだが。

実Device上かSimulator上かはプログラムで識別できる。 [[UIDevice currentDevice]model]によりNSStringでモデル名が得られるので、これで判別すれば良い。


NSLog()/printf()をDistribute版に残しておいても良いのか


結論から言えば「外した方が良い」。 動作に影響がないように思われるが、 出力先がNULデバイス相当になるだけで処理そのものは動いていると思われ、 速度とおそらくログを取るためのバッファーメモリも確保されるので、その影響も出る。

DEBUG(デバッグ時)だけNSLog()/printf()を有効にしたいなら、
#define DEBUG   // コンパイラオプションに入れてももちろんOK(というか、その方が普通)
//
#ifndef DEBUG 
#define NSLog(...)
#define printf(...)
#endif
と書いておけば、基本的にそれぞれの場所でのソース変更は不要である。 プロジェクト名_Prefix.pchというソース内に記述しておけば、全てのソースから暗黙でインクルードされるので楽である。

本当は「アクティブな構成」がDebugかどうかを識別出来るマクロがあると良いのだが、 現在までの所、発見出来ていない。インターネット上にはDEBUGが定義されるような記述もあったが、間違い。 Xcode4ではコンパイルオプションの設定が楽になっているので、デバッグコンパイル時のみ-DDEBUGを設定しておいた方が良いだろう。

なお、NSLog()/Printf()内だけで参照するような変数があるとコンパイラが警告を出すので、 無視するか、その辺りを#ifdef DEBUGで処置しておく。
if () {
   NSLog(~);
}
のような処理は、気になるなら同様に処置すればよいが、ほっておいてもコンパイラが最適化で式自体を勝手に削除してくれるはずなので 問題ない。こちらは警告も出ない、はず。


組み込み機器で開発していた技能はiOS上で役に立つか


いわゆる組み込み機器におけるソフト開発をしていた人が、iOS上に来た場合、 果たしてその技能が役に立つかどうかを、経験からまとめてみた。 「プログラムを設計する」とか言う、基本的な部分は除く。 また、Web上でのプログラムも除く。

μITRON系からの場合 Linux系からの場合 他は知らん。

どちらからの場合であっても、iOSというものは、非常に特異な環境であり、 Objective-C、NSクラス、UIKitクラスを始め、覚えることが非常にたくさんあり それはそれで大きな「山」であることは間違いない。
それでもどちらかと言えば、μITRONからの移行の方が、楽に出来ると思う。 これはある意味「アセンブラを知ってたら、C言語なんて理解するのに何の苦労もない」のと同じで、 プログラム動作の根本というか基本を知っていたら、それより上位の考え方は理解出来るのに近い。

 iOS上でも、Web環境上だけでプログラムを組むならLinux上で行うのと大差ないのかもしれないけど、 それはよく知らないので語らない。