[英]How do I define a macro with variadic method in objective-C?
我試圖打電話的方法是;
- (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");
我在控制台中看到的只是;
嘿
我哪里錯了? 我是新手使用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__]
(注意:我在上面的最后一個宏定義中使用反斜杠,允許宏寫在多行上,而不是寫在一個大的長行上)
有關更多信息, 請參閱此處有關Variadic宏的官方GCC文檔 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.