将Log宏转换为目标C字符串

时间:2018-09-01 23:51:14

标签: c++ ios objective-c

我们有一个带有以下DebugLog宏的C ++库,该宏可写入文件

    std::string var("some string");
    DebugLog( << "Output" << var );

我们想在Objective C代码中使用它,以便ObjC和C ++库都写入同一日志文件。

在我们现有的ObjC中,我们使用了一个日志宏,该宏与格式参数一起使用时不会产生来自编译器的警告

    LOG("Error description %s", [[error  localizedDescription] UTF8String]);

但是所有不带格式参数的用法都会产生警告,例如

    LOG("initialising")

LOG宏的定义如下所示,并且正在生成警告“格式字符串不是字符串文字”。任何人都知道如何改进代码以消除此警告。

 #define LOG(fmt, ...) do { \
      NSString *tmp =[NSString stringWithFormat:[NSString stringWithUTF8String:fmt], ##__VA_ARGS__];   \
      DebugLog( << [ tmp UTF8String] ); \
 }   while(0) \

1 个答案:

答案 0 :(得分:0)

在您的示例中,您似乎正在使用LOG和C字符串作为格式字符串,在此基础上,原始的NSLog版本可能是:

#define LOG(fmt, ...) NSLog(@fmt,  ##__VA_ARGS__);

提供的 fmt始终是文字字符串。宏在词法分析之前进行操作(或至少有效地进行操作,取决于实现方式)–因此,术语“预处理器”是指用于处理宏,条件编译等的编译器部分。您的宏示例:

LOG("Error description %s", [[error  localizedDescription] UTF8String]);

扩展到:

NSLog(@"Error description %s", [[error  localizedDescription] UTF8String]); 

,编译器将格式字符串视为Objective-C字符串。

以类似的方式,您可以重写宏以将C ++函数用作:

#define LOG(fmt, ...) DebugLog( [NSString stringWithFormat:@fmt,  ##__VA_ARGS__].UTF8String );

HTH