Objective c 忽略#定义宏调用中的逗号
我创建了一个特殊的控制台日志函数宏。它可以成功工作,除非参数中有逗号,即使它是另一个表达式的一部分,即不是另一个参数。我认为这是因为宏是在预处理阶段扩展的,所以语义分析还没有发生,无法理解逗号不是另一个参数。我的意思是:Objective c 忽略#定义宏调用中的逗号,objective-c,macros,Objective C,Macros,我创建了一个特殊的控制台日志函数宏。它可以成功工作,除非参数中有逗号,即使它是另一个表达式的一部分,即不是另一个参数。我认为这是因为宏是在预处理阶段扩展的,所以语义分析还没有发生,无法理解逗号不是另一个参数。我的意思是: #定义日志(消息)[MyLogger logDebug:message with ClassandMethodName:uuu PRETTY_uFunction_uuuuuLineNumber:uuu LINE_uu] +(BOOL)logDebug:(NSString*)带有
#定义日志(消息)[MyLogger logDebug:message with ClassandMethodName:uuu PRETTY_uFunction_uuuuuLineNumber:uuu LINE_uu]代码>
+(BOOL)logDebug:(NSString*)带有classandmethodname:(const char*)name lineNumber:(int)lineNumber的消息代码>
这些工作:
FANCY_LOG(@"Hello world");
FANCY_LOG([NSString stringWithFormat:@"Hello!"]);
这不起作用:
FANCY_日志([NSString stringWithFormat:@“Hello%@!”,planet])代码>
虽然逗号显然是NSString
表达式的一部分,但宏将其解释为另一个参数,但我得到以下错误:
为宏调用之类的函数提供了太多参数
以下是我尝试过但未成功的方法(以及这些方法的变体):
你做错了。首先,有很多很好的现成解决方案,因此您不必重新发明车轮(不记得了,但我认为CocoaLumberjack
是最好的)
您的记录器可以如下所示(我对Objective C有点生疏):
谢谢你的回复。我没有试图传递多个字符串作为日志参数,我只是试图传递一个[NSString…]方法调用,但它将逗号解释为另一个参数(参见上面的示例)@JosueEspinosa您试图做的是不可能的,预处理器总是将逗号解释为宏参数分隔符
#define FANCY_LOG(...) [MyLogger logDebug:##__VA_ARGS___ withClassAndMethodName: __PRETTY_FUNCTION__ lineNumber: __LINE__];
#define FANCY_LOG(message) [MyLogger logDebug:#message withClassAndMethodName: __PRETTY_FUNCTION__ lineNumber: __LINE__];
+(void) function:(char *)methodName
inLine:(int)line
logs:(NSString *)format, ...;
...
#define FANCY_LOG(...) [MyLogger function: __PRETTY_FUNCTION__ \
inLine: __LINE__ \
logs: __VA_ARGS__]
// then usage:
FANCY_LOG(@"Hello %@!", planet);