xcode中处理工程警告的几种方法

随着项目的慢慢发展,工程中的警告数量可能越来越多。这些警告有的是我们自己写出来的,有的来自第三方代码,下面以一个64位转32位损失精度的警告为例来说明如何处理警告。


产生警告的代码片段


long long i64 = 0x0000F000;
int i32 = i64;
NSLog(@"-------->%d", i32);


找到警告类型


定位警告方法见下图:

xcode中处理工程警告的几种方法_第1张图片


按照上图定位后,我们可以看到详细的编译信息:


xcode中处理工程警告的几种方法_第2张图片


可以看到警告信息,展开具体的编译警告信息


xcode中处理工程警告的几种方法_第3张图片


注意图中的选中高亮部分,这就是每条警告的具体信息,
如上是:-Wshorten-64-to-32,
即:将 64 位转换为 32 位可能损失精度。
-Wshorten-64-to-32 是产生警告的编译参数,忽略这种类型警告的编译参数为在前面加 no 即:-Wno-shorten-64-to-32。


方法一:通过完善代码处理警告


对于如上的警告类型,程序员需要确定转换时是否会损失精度,
如果不会损失精度,直接强制类型转换:

long long i64 = 0x0000F000;
int i32 = (int)i64;
NSLog(@"-------->%d", i32);
如果会损失精度,改变变量类型:
long long i64 = 0x0000F000;
long long i32 = i64;
NSLog(@"-------->%lld", i32);
这种处理警告的方法主要适用于我们自己编写的代码,即:我们要知道自己写的是什么。


方法二:通过编译指示符忽略警告


    long long i64 = 0x0000F000;
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wshorten-64-to-32"
    int i32 = i64;
#pragma clang diagnostic pop

使用这种方法可以在源文件的某个部分忽略警告。


方法三:通过宏控制忽略编译警告

定义宏:
#define DiscardLostPrecisionWarning(CodeBlock) \
do { \
    _Pragma("clang diagnostic push") \
    _Pragma("clang diagnostic ignored \"-Wshorten-64-to-32\"") \
    CodeBlock; \
    _Pragma("clang diagnostic pop") \
} while (0)

使用宏:
int i32 = 0;
DiscardLostPrecisionWarning(i32 = i64);


方法四:忽略指定文件的编译警告


在 Build Phases 中为指定文件增加编译参数:-Wno-shorten-64-to-32,如下图:

xcode中处理工程警告的几种方法_第4张图片

这种方法可以在不修改源码的情况下忽略文件中某种类型的警告,主要适用于以源码形式引入的第三方库。


方法五:忽略指定Target的编译警告


在 Target –> Build Settings -> Custom Complier Flags -> Other Warning Flags 中增加 -Wno-shorten-64-to-32,如下图:

xcode中处理工程警告的几种方法_第5张图片

这种方法可以在不修改源码的情况下忽略Target中某种类型的警告。


方法六:忽略工程的编译警告


在工程中忽略警告的方法与在 Target 中忽略警告的方法类似,但是可以控制工程中的所有 Target,前提是:Target要继承 Project 的编译设置,设置继承的方法见下图:

xcode中处理工程警告的几种方法_第6张图片

即增加:$(inherited)。
然后设置工程的Build Settings -> Custom Complier Flags -> Other Warning Flags 中增加 -Wno-shorten-64-to-32,如下图:

xcode中处理工程警告的几种方法_第7张图片

然后到 Target 中可以看到编译设置为:

xcode中处理工程警告的几种方法_第8张图片

注意:编译设置没有使用加粗字体,说明是继承来的。

你可能感兴趣的:(xcode中处理工程警告的几种方法)