当我从C ++调用NSLog时,Xcode抱怨传递给NSLog的格式字符串不是文字字符串。这是触发警告的一行代码:
NSLog(CFSTR("Leaking?"));
我不知道在C ++中编写文字NSString的任何方法,我没有看到可以在项目设置中关闭的相关警告。有没有办法从C ++调用NSLog而不触发此消息?我正在使用Xcode 4.2.1。
编辑:这确实是C ++代码。我通常避免使用Objective-C ++,坚持使用Objective-C或普通的旧C ++,因为没有官方文档说明Objective-C ++中哪些有用,哪些没有。我只发现模糊的警告(例如)STL的某些部分可能存在问题。我使用C ++的模板,STL和其他“高级”功能,所以我想安全地使用它。
编辑#2,解决方案:我只是想通了clang支持的警告标志比实际记录的要多得多。 (从Xcode提供给我的长长的警告列表中可以看出这一点。)我尝试了-Wno-format-nonliteral a la gcc,现在Xcode很高兴。
答案 0 :(得分:7)
您所要做的就是编写@"this"
来创建一个文字NSString对象。
所以用NSLog(@"Leaking?");
替换该行,你应该没问题。
您可能必须使用扩展名.mm
重命名文件,以确保将其编译为Objective-C ++(Objective-C和C ++的突变爱之子)。如果你不想这样做,你可以在一个调用NSLog的小mm文件中创建一个包装器函数,然后从你的C ++代码中调用该函数。它看起来像这样:
void MyNSLog(const char *message)
{
NSLog(@"%s", message);
}
请注意,编译器给你带来悲伤的原因是使用除了不可变字符串文字之外的任何内容(其中内容在编译时是已知的)存在安全风险。否则,可以将格式字符串更改为包括不存在的参数的格式说明符(例如,%d
)。如果发生这种情况,NSLog会从堆栈中获取随机指针,并且可能发生一些不好的事情。 (有关详细信息,请参阅this question。)
答案 1 :(得分:4)
如果您正在调用NSLog
,Foundation,那么您正在使用Objective-C。使用NSLog(@"Leaking?");
并确保您的文件具有.mm
扩展名,以明确表示您正在混合使用Objective-C
和C++
。