【发布时间】:2011-05-29 06:10:45
【问题描述】:
我有以下简化代码示例:
// in .h file
// define a macro for partial method
#define debugWithMsg context:(CFStringRef)__FUNCTION__ lineNumber:__LINE__ debug:
@interface MyLogger : NSObject {
...
}
- (void) context:(CFStringRef)function
lineNumber:(int)line
debug:(NSString*)messageFormat, ...;
@end
我在其他类中使用此方法将调试消息打印到 XCode 控制台。这是我测试调试方法的示例(在带有表视图的 MyViewController 类中):
- (NSInteger)tableView:(UITableView *)table numberOfRowsInSection:(NSInteger)section {
...
// myLogger is an instance of MyLogger.
[myLogger debugWithMsg@"something for %@", @"testing!"];
...
}
...
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
...
[myLogger debugWithMsg@"something for %@", @"another testing!"];
...
}
上面的例子效果很好;但是,对我来说,它看起来不像标准的 C/C++ 或 ObjC 语法。我需要使用这个宏的原因是我想将前两个参数作为“常量”传递给方法。实际上,这两个参数也是宏:__FUNCTION__ 是 C++ 宏,而 __LINE__ 是 C 标准宏。这两个特殊宏将动态映射到函数字符串和调用方法的行号。例如,上面的调试方法调用会在 XCode 控制台中打印一条消息,如下所示:
[timestamp] -[MyViewController tableView:numberOfRowsInSection:] line:107 - something for testing!
...
[timestamp] -[MyViewController tableView:cellForRowAtIndexPath:] line:124 - something for another testing!
MyLogger 类主要供我内部使用。有没有其他更好的做法来获得相同的结果?或者这个实现有什么问题吗?
我正在考虑以与 NSLog(fmt, ...) 相同的方式定义我的宏,这也是一个宏:
MyDebugLog(instance, fmt, ....)
instance 是 MyLogger 的一个实例,fmt, ... 是格式字符串和 var 列表。这是我对宏的试用定义:
#define MyDebugLog(logger, fmt, ...) \
[logger, context:(CFStringRef)__FUNCTION__ lineNumber:__LINE__ \
debug:fmt, ## _VA_ARGS__]
我在使用宏的代码中出现编译错误“'context' undeclared”:
- (NSInteger)tableView:(UITableView *)table numberOfRowsInSection:(NSInteger)section {
...
// myLogger is an instance of MyLogger.
MyDebugLog(myLogger, @"something for %@", @"testing!"); // compiling error!
...
}
不确定我的定义有什么问题。有什么建议?
【问题讨论】:
-
请注意,
__LINE__扩展为数字,而不是字符串。 -
您更新后的#define 不应在
[logger context:中包含, -
@Stephen,很好,你是对的!谢谢!
-
很高兴我能帮上忙。希望它对你有用。
标签: c++ objective-c c