警告:格式字符串不是字符串文字 [英] Warning: Format string is not a string literal

查看:216
本文介绍了警告:格式字符串不是字符串文字的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我收到格式字符串不是字符串字面值警告从以下行

I am getting "Format string is not string literal" warning from following line

NSString *formattedString = [[NSString alloc] initWithFormat:format arguments:valist];

我在以下函数中使用这个函数

I using this in following function

- (void)logMessage:(NSString *)format
         level:(LoggingLevel)level
withParameters:(va_list)valist {
         if (level >= self.loggingLevel) {
              NSString *formattedString = [[NSString alloc] initWithFormat:format arguments:valist];        
         } 

任何想法如何解决这个问题?我使用Xcode 4.6.3

Any idea how to fix this ? I am using Xcode 4.6.3

推荐答案

如果你告诉编译器你的方法有一个格式化的参数, b $ b NS_FORMAT_FUNCTION 宏:

If you tell the compiler that your method has a format-like argument, using the NS_FORMAT_FUNCTION macro:

- (void)logMessage:(NSString *)format
         level:(LoggingLevel)level
withParameters:(va_list)valist NS_FORMAT_FUNCTION(1,0) {
         if (level >= self.loggingLevel) {
              NSString *formattedString = [[NSString alloc] initWithFormat:format arguments:valist];        
         } 
}

然后


  • 您的方法中的编译器警告消失,


示例:

NSString *abc = @"foo %@ bar";
[self logMessage:abc level:7 withParameters:NULL];

warning: format string is not a string literal [-Wformat-nonliteral]
[self logMessage:abc level:7 withParameters:NULL];
                 ^~~

ADDED:函数。
它们也应该被标记为 NS_FORMAT_FUNCTION

+ (void)logVeryFineWithFormat:(NSString *)format, ... NS_FORMAT_FUNCTION(1,2)
{
    va_list ap;
    va_start(ap, format);
    [[self sharedInstance] logMessage:format level:VERY_FINE withParameters:ap];
    va_end(ap);
}

+ (void)say:(NSString *)formatstring, ... NS_FORMAT_FUNCTION(1,2)
{
    va_list arglist;
    va_start(arglist, formatstring);
    // This is not needed: 
    // NSString *litralString = [NSString stringWithFormat:@"%@",formatstring];
    NSString *statement = [[NSString alloc] initWithFormat:formatstring arguments:arglist];
    va_end(arglist);
    [ModalAlert ask:statement withCancel:@"Okay" withButtons:nil];
}

这篇关于警告:格式字符串不是字符串文字的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆