任何:
我想使用一个宏来打印日志,
#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 *'”。
如何修改,请?
答案 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);