代码之家  ›  专栏  ›  技术社区  ›  tech74

将日志宏转换为目标C字符串

  •  1
  • tech74  · 技术社区  · 8 年前

    我们有一个C++库,它下面的调试文件宏写入文件

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

    我们希望在我们的目标C代码中使用这个,这样Objc和C++库都会写入同一个日志文件。

    在我们现有的ObjC中,我们使用了一个log宏,当它与格式参数一起使用时,编译器不会发出警告

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

        LOG("initialising")
    

    LOG宏的定义如下所示,它正在生成一个警告“Format string is not a string literal”。任何人都知道如何改进代码来删除此警告。

     #define LOG(fmt, ...) do { \
          NSString *tmp =[NSString stringWithFormat:[NSString stringWithUTF8String:fmt], ##__VA_ARGS__];   \
          DebugLog( << [ tmp UTF8String] ); \
     }   while(0) \
    
    1 回复  |  直到 8 年前
        1
  •  0
  •   CRD    8 年前

    从你的例子来看,似乎你正在使用 LOG NSLog 版本可以是:

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

    假如 fmt 之前 词法分析(或至少有效地这样做,取决于实现)因此术语“预处理器”是指编译器中处理宏、条件编译等的部分

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

    扩展到:

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

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

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