NSLog宏只能使用一个参数

时间:2013-12-08 19:28:18

标签: ios objective-c nslog

#define LogMsg(msg) ((DebugMode)?NSLog(@"<%@:%@:%d:%@>", NSStringFromClass([self class]), NSStringFromSelector(_cmd), __LINE__,msg):NO)

使用此宏我可以打印出来:

LogMsg(@"Test");

或者

NSArray *testArray = @[@"one",@"two"];
LogMsg(testArray);

如何使用宏替换也可以使用两个参数,如NSLog,并且仍然能够以我正在使用上述形式打印数组? 例如:

NSLog (@"test: %@",test);

  • 我不想使用第三方类,并用宏来解决上述问题。

2 个答案:

答案 0 :(得分:2)

这应该有效:

#define LogMsg(msg, ...) ((DebugMode)?NSLog(@"<%@:%@:%d>" msg, NSStringFromClass([self class]), NSStringFromSelector(_cmd), __LINE__, ##__VA_ARGS__):NO)

它使用预处理器字符串连接@"<%@:%@:%d>" msg来获得&#34;组合格式字符串&#34;固定和可变部分, 和preprocessor variadic macros##__VA_ARGS__

已添加:我不认为可以定义一个宏,以便

LogMsg(someObject);
LogMsg(formatString, arg1, arg2, ...);

的工作。

答案 1 :(得分:0)

如此接近!您的宏使用以下调用:

ALog("Test");
NSArray *testArray = @[@"one",@"two"];
ALog("%@", testArray);

编译器将自动连接:

@"%s [Line %d] " "Test"

为:

@"%s [Line %d] Test"