Hatena::Groupiphone-dev

iPhoneアプリ開発まっしぐら★ このページをアンテナに追加 RSSフィード

引っ越し後の日記はコチラです

tokoromのその他の日記

2010-04-21

リリースビルド時にNSLogを自動で一括削除する(Snow Leopard対応版)

| 23:57 | はてなブックマーク - リリースビルド時にNSLogを自動で一括削除する(Snow Leopard対応版) - iPhoneアプリ開発まっしぐら★

以前に、コードの中のNSLogをリリースビルド時に自動で一括削除するために、以下のようにNSLogマクロで置き換えるという記事を書いたのですが、

#if !defined(NS_BLOCK_ASSERTIONS)

#if !defined(NSLog)
#define NSLog( m, args... ) NSLog( m, ##args )
#endif

#else

#if !defined(NSLog)
#define NSLog( m, args... )
#endif

#endif

Leopard -> Snow Leopard にバージョンアップしてSDKも更新したら、NSLogの使い方(NSStringオブジェクトをそのまま渡しているところなど)によっては以下のWarningが出てしまうようになりました。

warning: format not a string literal and no format arguments

どうやらNSLogの宣言に引っ付いているフォーマット文字列のチェックで警告が出されているようです。↓の__attribute__のところ!

FOUNDATION_EXPORT void NSLog(NSString *format, ...) __attribute__((format(__NSString__, 1, 2)));

※__attribute__についてはコチラを参考にさせていただきました。


あくまでもNSLogを使う側の記述は変えないで対応させたいので、NSLogマクロの定義を以下のように変更してみました。

※4/23 さらに改善!

#if !defined(NS_BLOCK_ASSERTIONS)

#if !defined(NSLog)
#define NSLog( args... ) NSLog( args, 0 )
#endif

#else

#if !defined(NSLog)
#define NSLog( args... )
#endif

#endif

これでWarningがきれいさっぱり消えてくれました。

やったー!

※NS_BLOCK_ASSERTIONSのところは、もちろん自分専用のデバッグ用フラグ(_DEBUG_とか)を定義してそれに置き換えてもOKです。


トリック

よくよく調べてみると、警告文↓

warning: format not a string literal and no format arguments

が、「フォーマット文字列のリテラルでもなく、そしてフォーマット用の引数が1つもないよー」とおっしゃっているそのままで

NSString* message = @"test";
NSLog( message );

みたいに単一の引数でオブジェクトを渡しているところで警告が出ていたわけです。

ということで、 単一の引数でなくしてやればよいのではと思い、

#define NSLog( args... ) NSLog( args, 0 )

というように、NSLogを使ったときは強制的に最後にダミー引数「0」を追加するようにしてやったということです。

これにより、↑の警告が出ていたサンプルはプリプロセッサにより

NSString* message = @"test";
NSLog( message, 0 );

と置き換えられ、NSLog関数に__attribute__で付加されたフォーマット文字列チェックを抜けることができたのです。

sakamotosakamoto2010/04/22 13:34#define NSLog(...) do {} while (0)
#define NSLog(...) NSLog(__VA_ARGS__)
でいかがでしょうか? @splhack

sakamotosakamoto2010/04/22 13:35同じ名前でdefineしてちゃ駄目ですね。

tokoromtokorom2010/04/22 14:07ひとまずGNUだと__VA_ARGS__が使えないみたいっす。
でもマクロの引数を可変引数のみにしちゃうというのは試していなかったので、帰宅したらさっそく試してみます!

tokoromtokorom2010/04/23 01:59おー、sakamotoさんのコメント↑のやつは、__attribute__をどうにか外すのはどうか、という意味だったんですねー。ぼくもちょっと考えてみます。

tokoromtokorom2010/04/23 02:33__attribute__についてちゃんと調べてみたら、改善案に辿りつけました!あざーす!

nasu3nasu32011/10/26 19:11Xcode4.2にすると、また"data argument not used by format string"という警告が出てしまっていたので、再度
#define NSLog( m, args... ) NSLog( m, ##args )
こちらに戻したら、出なくなりました。ご報告まで。