【问题标题】:Format specifies type 'int' but the argument has type 'NSString *'格式指定类型“int”,但参数的类型为“NSString *”
【发布时间】:2014-04-23 14:17:17
【问题描述】:

任何人:

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

#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);

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

请问如何修改?

【问题讨论】:

标签: ios objective-c generics macros nslog


【解决方案1】:

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

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

【讨论】:

  • 为什么投反对票?这消除了警告并正常工作。
【解决方案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)

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

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

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

【讨论】:

  • 尝试转换为 id 会在 ARC 下生成错误。 (但反对票不是来自我。)
【解决方案3】:
 #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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-02
    • 2015-06-10
    • 2017-09-04
    • 1970-01-01
    • 2016-09-29
    • 2014-01-28
    相关资源
    最近更新 更多