Xcode开发中能否通过#define规则实现#pragma unused(x)消除未使用变量警告
解决方案
你可以通过以下两种方式修改宏定义,完全消除Release模式下自定义NSLog宏带来的未使用变量警告,不需要关闭全局警告:
方案1:使用_Pragma运算符实现#pragma unused调用
预编译器提供了_Pragma运算符,可以在宏定义中触发编译指令,不需要直接写#pragma。你可以把Release模式下的NSLog宏修改为如下实现,自动标记所有可变参数为未使用:
#ifdef DEBUG #define NSLog(FORMAT, ...) fprintf(stderr, "%s \n", [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]) #else #define NSLog(FORMAT, ...) \ do { \ _Pragma("unused(FORMAT)") \ _Pragma("unused(__VA_ARGS__)") \ } while(0) #endif
这里用do{}while(0)包裹是标准的多语句宏写法,避免宏在分支语句中展开时出现语法错误。
方案2:结合__unused属性实现更简洁的写法
你也可以直接在宏定义里把参数赋值给加了__unused标记的临时变量,让编译器明确知道这些参数是有意未使用的:
#ifdef DEBUG #define NSLog(FORMAT, ...) fprintf(stderr, "%s \n", [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]) #else #define NSLog(FORMAT, ...) \ do { \ __unused NSString *unused_format = FORMAT; \ __unused id unused_args[] = {__VA_ARGS__}; \ } while(0) #endif
额外说明
你现有的ALLWAYSLog宏不需要改动,它本身会用到所有传入参数,不会触发未使用警告。
内容的提问来源于stack exchange,提问作者Ol Sen
相关产品推荐
相关产品推荐

