格式指定类型' int'但是这个论点有类型' NSString *'

时间:2014-03-18 04:14:04

标签: ios objective-c generics macros nslog

任何:

我想使用一个宏来打印日志,

#define isaObject(parameter) _Generic((parameter), id: YES, id __strong: YES, default: NO)
#define kNSLog(parameter) do                   \
    {                                          \
        BOOL is = isaObject((parameter));      \
        if (is)                                \
        {                                      \
            NSLog(@"----Yes : %@", parameter); \
        }                                      \
        else                                   \
        {                                      \
            NSLog(@"----No : %d", parameter);  \
        }                                      \
    } while (NO)


int i = 99;
NSString * s = @"abcd";

kNSLog(i);
kNSLog(s);

然后,编译器发出警告“Format指定类型'int',但参数的类型为'NSString *'”。

如何修改,请?

3 个答案:

答案 0 :(得分:6)

您可以将参数显式转换为int以避免该警告:

NSLog(@"----No : %d", (int)parameter); \

答案 1 :(得分:2)

如果您“手动”执行宏替换,那么调试非常容易。

kNSLog(s)

扩展为

do
{                                        
    BOOL is = isaObject((s));
    if (is)                                
    {                                      
        NSLog(@"----Yes : %@", s); 
    }                                      
    else                                   
    {                                      
        NSLog(@"----No : %d", s); // the warning is thrown here
    }                                      
} while (NO)

您正在显式检查参数的类型,但您没有通知编译器,因此它看到一个分支实际上可能正在尝试使用NSString格式打印%d

解决方案是在检查参数后显式转换参数,以便为编译器提供足够的信息以使其保持静默。具体地

    if (is)                                
    {                                      
        NSLog(@"----Yes : %@", parameter); 
    }                                      
    else                                   
    {                                      
        NSLog(@"----No : %d", (int)parameter);
    }    

答案 2 :(得分:0)

 #define isaObject(parameter) _Generic((parameter), id: YES, id __strong: YES, default: NO)

  #define kNSLog(parameter) do                  
  {                                          
      BOOL is = isaObject((parameter));      
      if (is)                                
      {                                     
          NSLog(@"----Yes : %@", parameter);
      }                                      
      else                                   
      {                                      
          NSLog(@"----No : %d", parameter);  
      }                                      
  }

   while (NO)

使用------>

NSString * s = @"YES";

kNSLog(s);