0

例えば:

debug_print(foobar);     // prints out:  foobar is (hello, world)
debug_print(i * 27);     // prints out:  i * 27 is 54

つまり、最初に変数または式を文字どおりに出力してから、その値をダンプします。

この形である必要はありません。文字列としても呼び出すことができます:

debug_print("foobar");     // prints out:  foobar is (hello, world)
debug_print("i * 27");     // prints out:  i * 27 is 54

更新:または、組み込まれていない場合、どのように書くことができますか?

4

2 に答える 2

1

マクロが使える

#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"ます.

于 2012-04-15T20:07:16.227 に答える
1

値を出力するメカニズムは、その値の型を知る必要があるため、Objective-C では完全に一般的な意味でやりたいことを実際に行うことはできません。間違いなくオブジェクト ポインターである式の場合、次のようにすることができます。

#define debug_print(expr) NSLog(@"%@ is %@", @#expr, (expr))

Objective-C++ では、テンプレートを使用して、次のような完全に一般的なソリューションを作成できます。

#define debug_print(expr) do { std::cerr << #expr << " is " << (expr) } while (false)

プリプロセッサと "stringify" 演算子 ("#") を使用すると、括弧内のテキストを取得して出力できます。

于 2012-04-15T20:07:26.113 に答える