gpt4 book ai didi

ios - 如何在 Objective-C 中使用可变参数方法定义宏?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:55:56 24 4
gpt4 key购买 nike

我尝试调用的方法是;

- (void)addLogWithLevel:(MDCLogLevel)logLevel logContent:(NSString *)logContent, ...
{
va_list args;
va_start(args, logContent);
NSString *message = [[NSString alloc] initWithFormat:logContent
arguments:args];
va_end(args);
MDCLog *log = [MDCLog logWithContent:message content:logLevel];
[self.deviceLogs addObject:log];
}

我已将宏定义为;

#define MDCLogDebug(format, ...) [[MDCLogController sharedController] addLogWithLevel:MDCLogLevelDebug logContent:(__VA_ARGS__)];

我已经尝试了这个宏的各种格式,但似乎没有任何效果。

如果我要打电话;

MDCLogDebug(@"Test:%@", @"Hey");

我在控制台中看到的是;

Hey

我哪里错了?我是 Variadic 方法的新手,我的 C 也不太好!

最佳答案

实际上,您的问题与 Objective-C 并没有直接关系,而是与 C 本身有关,因为宏是普通的 C 预处理器指令。

在宏中,__VA_ARGS__ 表示代替 ... 放置的参数。

所以在调用 MDCLogDebug(@"Test:%@", @"Hey") 时,format 参数是 @"Test:% @"__VA_ARGS__ 代表之后的其余参数,即在您的情况下只是 @"Hey"

如果您想将 @"Test:%@"@"Hey" 作为参数传递给 logContent:,您必须明确地告诉它,使用:

#define MDCLogDebug(format, ...) [[MDCLogController sharedController] addLogWithLevel:MDCLogLevelDebug logContent:format, __VA_ARGS__]

注意:更好的解决方案是在 __VA_ARGS__ 之前使用 ## 前缀,这样如果 __VA_ARGS__ 就不会添加逗号 为空(即,如果您只传递一个 format 参数,但之后什么都不传递,例如 MDCLogDebug(@"Foo")):

#define MDCLogDebug(format, ...) [[MDCLogController sharedController] \
addLogWithLevel:MDCLogLevelDebug \
logContent:format, ## __VA_ARGS__]

(注意:我在上面最后一个宏定义中使用了反斜杠,以允许将宏写在多行上,而不是写在一个大的长行上)

欲了解更多信息,see the official GCC documentation about Variadic Macros here .

关于ios - 如何在 Objective-C 中使用可变参数方法定义宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21512382/

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