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)); \
})

有了这个,你可以在任何地方使用(几乎)任何类型的 debug_print,只要它在 print_debug_format_for_type 中。传入的编码(来自@encode)可以在这里找到[apple docs],格式字符串的格式可以在这里找到[also apple docs]。照原样,这适用于任何对象、c 样式字符串、整数、浮点数或双精度表达式。

(小警告:ObjC BOOL 类型实际上是一个 typedef'd char,所以如果你 print_debug 一个布尔表达式,它会说它是 1 或 0。虽然这有效,它也意味着如果你 print_debug 一个 char 表达式,它会说它是字符的 ascii 号。要改变这种行为(并中断 BOOL 打印),请将 case '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 回答