【问题标题】:Clean NSLog - No timestamp and program nameClean NSLog - 没有时间戳和程序名称
【发布时间】:2011-09-22 15:21:16
【问题描述】:

我几乎用这段代码完成了一个干净的 NSLog:

#define NSLog(FORMAT, ...) printf("%s\n", [[NSString stringWithFormat:FORMAT, __VA_ARGS__] UTF8String]);

如果我这样做,这会很好:

 NSLog(@"Show %@ message", @"this");

但是,如果我使用它会失败

 NSLog(@"One argument");

因为__VA_ARGS__什么都不是,所以它产生

 printf("%s\n", [[NSString stringWithFormat:@"One argument",] UTF8String]);

所以,问题在于逗号。因为这是宏,__VA_ARGS__ 什么都不是。所以我不能做像__VA_ARGS__==nil 这样的事情,因为会产生==nil 并且会失败。

问题很简单:当__VA_ARGS__ 什么都不是时该怎么办?或者只有在有更多参数时才使用逗号。

【问题讨论】:

    标签: objective-c c ios nslog


    【解决方案1】:

    使用此代码(注意## 部分):

    #define NSLog(FORMAT, ...) fprintf(stderr, "%s\n", [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]);
    

    【讨论】:

    • 工作正常。我认为##__VA_ARGS__ 毫无意义,但可以工作。
    • 您应该将 printf("%s\n" 更改为 fprintf( stderr, "%s\n" 。由于各种原因,最重要的是,printf 进入缓存的 stout,stderr 是未缓存的直接输出。
    • 哼.. @Nathan Day。我看到了这样的事情,不明白。但如果它能让事情变得更好,我会使用:)
    • 哦,多么甜蜜! :)
    • 有没有办法让这个全球化。我仍然可以获得其他库的时间和应用程序名称。
    猜你喜欢
    • 1970-01-01
    • 2018-06-20
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 2018-04-16
    • 2011-12-14
    • 1970-01-01
    相关资源
    最近更新 更多