C++ 使用Objective-C中的宏记录函数名和行号

C++ 使用Objective-C中的宏记录函数名和行号,c++,objective-c,c,C++,Objective C,C,我有以下简化的代码示例: // 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

我有以下简化的代码示例:

// 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类中):

上面的例子效果很好;然而,对我来说,它看起来不像是标准的C/C++或ObjC语法。我需要使用这个宏的原因是我想将前两个参数作为“常量”传递给该方法。事实上,这两个参数也是宏:作为函数的C++函数是一个C++宏,而α是一个C标准宏。这两个特殊宏将动态映射到函数的字符串和调用方法的行号。例如,上面的调试方法调用在XCode控制台中打印消息,如下所示:

[timestamp] -[MyViewController tableView:numberOfRowsInSection:] line:107 - something for testing!
...
[timestamp] -[MyViewController tableView:cellForRowAtIndexPath:] line:124 - something for another testing!
MyLogger类主要用于我的内部使用。有没有其他更好的方法可以达到同样的效果?或者这个实现有什么问题吗

我想用与NSLog(fmt,…)相同的方式定义我的宏,NSLog也是一个宏:

MyDebugLog(instance, fmt, ....)
其中实例是MyLogger的实例,而fmt。。。是格式字符串和变量列表。这是我对宏的试用定义:

#define MyDebugLog(logger, fmt, ...) \
  [logger, context:(CFStringRef)__FUNCTION__ lineNumber:__LINE__ \
   debug:fmt, ## _VA_ARGS__]
在使用宏的代码中出现编译错误,代码中的“context”未声明:

- (NSInteger)tableView:(UITableView *)table numberOfRowsInSection:(NSInteger)section {
  ...
  // myLogger is an instance of MyLogger.
  MyDebugLog(myLogger, @"something for %@", @"testing!"); // compiling error!
  ...
}
不确定我的定义有什么不对。有什么建议吗

这就是我所用的

#定义SFLog(message,…)NSLog(@“SFLog:%s[Line%d]”message)、u PRETTY_函数、uu行、35; VA_参数)

您使用它的方式与SFLog(@“somevar%f”,myFloat)完全相同除了它在'SFLog'(我也使用'SFError')和
\uu PRETTY\u函数
宏前面加上前缀


[编辑]

我找到了我得到这个的那个邮局


[编辑]


Commenter在下面指出,可以在不使用
##
的情况下定义宏。
##
纯粹是GCC的东西,不符合C99标准<代码>##也适用于LLVM/Clang 1.5(XCode 3.2.4)以及-std=c99和-std=gnu99的编译器设置。要知道,如果宏不能按预期工作,那么它会有一些限制。

@Jonathan,两个哈希对我来说很有用。你可能只需要一个,我承认我知道的不足以告诉你区别。奇怪的是……它“不应该”起作用;单个散列是字符串化操作符;双哈希是令牌粘贴运算符。实际上,仔细想想,双哈希不应该存在,但这并不能解释为什么允许使用它。@Jonathan,根据我得到它的SO帖子,
\(如中所述,GCC的C预处理器不会抱怨。对于简单的情况,也会产生相同的结果。让我玩一下宏…@Jonathan,有趣的是,同样的问题被贴到了宏的原始作者身上。这可能是一个编译技巧/黑客,这就是为什么它不常见的原因。请注意,
\uu LINE\uu
扩展为一个数字,不是字符串。您更新的#define不应该在
[logger context:
@Stephen中有
,很好,您说得对!谢谢!很高兴我能帮助您。希望它对您有用。
- (NSInteger)tableView:(UITableView *)table numberOfRowsInSection:(NSInteger)section {
  ...
  // myLogger is an instance of MyLogger.
  MyDebugLog(myLogger, @"something for %@", @"testing!"); // compiling error!
  ...
}