nem*_*sys 1 macros logging objective-c
我发现了一些关于如何使用NSLog作为基础并添加PRETTY_FUNC和LINE的宏变量,但这些宏的所有变体只是将结果输出到控制台.
我想要一个可以采用可变数量参数的格式的宏,添加方法的名称和调用它的行号,然后返回NSString但是到目前为止,编译器总是抱怨我称之为的地方.我的最新版本如下:
#define FileLog(format, ...) {\
return [NSString stringWithFormat:@"\n %s [Line %d] \n %@",
__PRETTY_FUNCTION__,
__LINE__,
[NSString stringWithFormat:(format), ##__VA_ARGS__]];\
}
Run Code Online (Sandbox Code Playgroud)
每次我从我的代码中调用它时,编译器都会生成以下错误之一:
error: expected expression before '{' token
Run Code Online (Sandbox Code Playgroud)
我不想写日志类或使用框架.必须有办法用宏来做到这一点?任何人?
提前致谢!
这完全可以用宏,我想你只需要更多的背景知识.
首先,宏不是函数,因此大括号是不必要的(事实上,它是导致错误的原因).宏实际上是一个相当愚蠢的"复制/粘贴",由预处理器使用它理解的语法自动化.
为了定义跨多行,并创建一个NSString"到位"的宏,你必须转义反斜杠换行,像这样:
#define FileLog(format, ...) \
[NSString stringWithFormat:@"\n %s [Line %d] \n %@", \
__PRETTY_FUNCTION__, \
__LINE__, \
[NSString stringWithFormat:format, ##__VA_ARGS__]]
Run Code Online (Sandbox Code Playgroud)
宏不会像函数一样"返回",因为正如我所提到的,它们只是一种"复制/粘贴"文本的方式.
您可以像这样使用它:
int num = 42;
NSLog(@"%@", FileLog(@"some number: %d", num));
Run Code Online (Sandbox Code Playgroud)
如果您要查看预处理器输出(预编译器在编译之前创建的文件),上面的示例将扩展为:
NSLog(@"%@", [NSString stringWithFormat:@"\n %s [Line %d] \n %@", __PRETTY_FUNCTION__, __LINE__, [NSString stringWithFormat:@"some number: %d", num]]);
Run Code Online (Sandbox Code Playgroud)