【问题标题】:NSLog macro that can take only one argumentNSLog 宏,只能接受一个参数
【发布时间】:2013-12-25 19:30:25
【问题描述】:
#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);

  • 我不希望为此使用第 3 方类,并使用宏解决上述问题。

【问题讨论】:

  • 您的第一个示例 NSLog(testArray) 不正确,并在运行时崩溃。第一个参数必须是格式字符串。
  • 我完全搞砸了这个问题。我已经用我正在使用的正确宏更新了问题。
  • 你能把LINE的宏也发一下吗?
  • LINE没有宏
  • 有一些技巧可以用来找出宏的参数数量,并根据它选择不同的宏来扩展。但我不记得该怎么做。

标签: ios objective-c nslog


【解决方案1】:

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

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

编译器会自动拼接:

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

到:

@"%s [Line %d] Test"

【讨论】:

    【解决方案2】:

    这应该可行:

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

    它使用预处理器字符串连接@"&lt;%@:%@:%d&gt;" msg 得到一个带有固定和可变部分的“组合格式字符串”, 和preprocessor variadic macros##__VA_ARGS__

    补充:我不认为可以定义一个宏,这样既

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

    工作。

    【讨论】:

    • 在尝试LogMsg(testArray); 时出现错误Expected ')'
    • @Sha:你必须以格式字符串开头:LogMsg (@"test: %@",test)
    • 这就是问题的重点:)。我不想使用格式字符串。我希望能够有时像这样LogMsg(testArray); 有时像这样使用它:LogMsg(@"test %@",someObject); 这可能吗?
    • @Sha:我认为宏不可能做到这一点。
    • 谢谢。请编辑您对答案的最后评论,如果没有工作解决方案将被发布,我可以接受。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-01
    • 1970-01-01
    相关资源
    最近更新 更多