gpt4 book ai didi

Objective-C 宏在接受具有可变数量参数的字符串时返回带有函数和行号的字符串?

转载 作者:行者123 更新时间:2023-12-05 08:44:22 24 4
gpt4 key购买 nike

我发现了一堆关于如何使用 NSLog 作为基础并添加 PRETTY_FUNCLINE 的宏变体,但这些宏的所有变体都只是输出结果到控制台。

我想要一个宏,它可以采用具有可变数量参数的格式,添加方法名称和调用它的行号,然后返回一个 NSString 但到目前为止,编译器总是提示在哪里我称之为。我的最新版本如下:

#define FileLog(format, ...) {\
return [NSString stringWithFormat:@"\n %s [Line %d] \n %@",
__PRETTY_FUNCTION__,
__LINE__,
[NSString stringWithFormat:(format), ##__VA_ARGS__]];\
}

每次我从我的代码中调用它时,编译器都会生成以下错误之一:

error: expected expression before '{' token

我不想为此编写日志类或使用框架。必须有办法用宏来做到这一点吗?有人吗?

提前致谢!

最佳答案

这完全可以通过宏实现,我认为您只需要了解更多背景知识即可。

首先,宏不是函数,因此大括号是不必要的(事实上,这是导致错误的原因)。宏实际上是一种相当愚蠢的“复制/粘贴”,由预处理器使用它理解的语法自动执行。

为了定义跨多行的宏并“就地”创建 NSString,您必须使用反斜杠转义换行符,如下所示:

#define FileLog(format, ...) \
[NSString stringWithFormat:@"\n %s [Line %d] \n %@", \
__PRETTY_FUNCTION__, \
__LINE__, \
[NSString stringWithFormat:format, ##__VA_ARGS__]]

宏不像函数那样“返回”,因为正如我提到的,它们只是“复制/粘贴”文本的一种方式。

你可以这样使用它:

int num = 42;
NSLog(@"%@", FileLog(@"some number: %d", num));

如果您要查看预处理器输出(预处理器在编译前创建的文件),上面的示例将扩展为如下内容:

NSLog(@"%@", [NSString stringWithFormat:@"\n %s [Line %d] \n %@", __PRETTY_FUNCTION__, __LINE__, [NSString stringWithFormat:@"some number: %d", num]]);

关于Objective-C 宏在接受具有可变数量参数的字符串时返回带有函数和行号的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10199768/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com