首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Format指定类型为“int”,但参数的类型为“NSString*”

Format指定类型为“int”,但参数的类型为“NSString*”
EN

Stack Overflow用户
提问于 2014-03-18 12:14:04
回答 3查看 3.2K关注 0票数 2

任何人:

我想使用一个宏来打印日志,如下所示:

代码语言:javascript
运行
复制
#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 *'“。

如何修改?

EN

回答 3

Stack Overflow用户

发布于 2014-09-06 06:18:01

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

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

票数 6
EN

Stack Overflow用户

发布于 2014-09-06 06:44:47

如果你“手动”执行宏替换,这很容易调试。

代码语言:javascript
运行
复制
kNSLog(s)

扩展为

代码语言:javascript
运行
复制
do
{                                        
    BOOL is = isaObject((s));
    if (is)                                
    {                                      
        NSLog(@"----Yes : %@", s); 
    }                                      
    else                                   
    {                                      
        NSLog(@"----No : %d", s); // the warning is thrown here
    }                                      
} while (NO)

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

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

代码语言:javascript
运行
复制
    if (is)                                
    {                                      
        NSLog(@"----Yes : %@", parameter); 
    }                                      
    else                                   
    {                                      
        NSLog(@"----No : %d", (int)parameter);
    }    
票数 2
EN

Stack Overflow用户

发布于 2014-09-12 18:55:14

代码语言:javascript
运行
复制
 #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)

请使用->

代码语言:javascript
运行
复制
NSString * s = @"YES";

kNSLog(s);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22470241

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档