マクロが使える
#define debug_print(expr...) NSLog(@"%@ is %@", @#expr, (expr))
ご覧のとおり、NSLog フォーマット文字列は %@ (オブジェクト) を想定しているため、整数にはバリアントを使用する必要があります。
#define debug_printI(expr...) NSLog(@"%@ is %d", @#expr, (expr))
編集:
単一のマクロを使用して、すべての型で機能させる方法があります: @encoding を使用して型を見つけます。
NSString *print_debug_format_for_type(const char *encoding) {
switch (encoding[0]) {
case '@': return @"%@ is %@";
case '*': return @"%@ is %s";
case 'f': return @"%@ is %f";
case 'd': return @"%@ is %f";
case 'q': return @"%@ is %qi";
case 'Q': return @"%@ is %qu";
case 'c':
case 'i':
case 's':
default: return @"%@ is %d";
}
}
#define debug_print(expr...) ({ \
typedef __typeof__(expr) t; \
NSLog(print_debug_format_for_type(@encode(t)), @#expr, (expr)); \
})
これにより、print_debug_format_for_type 内にある限り、debug_print を (ほぼ) 任意のタイプでどこでも使用できます。(@encode から) 渡されるエンコーディングはここ[apple docs] で見つけることができ、フォーマット文字列の形式はここ[apple docs] で見つけることができます。そのままで、これは任意のオブジェクト、C スタイルの文字列、integer、float、または double 式で機能します。
(注意: ObjC BOOL 型は実際には typedef された char であるため、ブール式を print_debug すると、1 または 0 であると表示されます。これは機能しますが、char 式を print_debug すると、文字の ASCII 番号だとします. この動作を変更する (そして BOOL 印刷を中断する) には、大文字と小文字の 'c' を に変更しreturn @"%@ is %c"
ます.