簡體   English   中英

如何在objective-C中使用可變方法定義宏?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM