我们有一个带有以下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) \
答案 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