任何人:
我想使用一个宏来打印日志,如下所示:
#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 *'“。
如何修改?
发布于 2014-09-06 06:18:01
您可以将参数显式转换为int以避免该警告:
NSLog(@"----No : %d", (int)parameter); \
发布于 2014-09-06 06:44:47
如果你“手动”执行宏替换,这很容易调试。
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);
} 发布于 2014-09-12 18:55:14
#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);https://stackoverflow.com/questions/22470241
复制相似问题