美文网首页iOS
iOS中#pragma clang diagnostic的常见用

iOS中#pragma clang diagnostic的常见用

作者: 翻炒吧蛋滚饭 | 来源:发表于2018-07-03 15:04 被阅读76次

将警告识别为错误

  如果我们希望一个警告必须被修改掉,以保证程序的安全,我们可以将警告识别为错误,虽然xcode的设置中可以将警告全部识别为错误,但这样做根本毫无意义,很多三方库都或多或少存在一些警告,这会导致项目很难编译通过。
  例:在项目中有些时候不得已需要通过Selector的方式执行方法的时候,又不想因为找不到Selector而导致unrecognized selector sent to instance的崩溃问题,就可以将找不到的Selector识别为错误:

    // clang诊断push
#pragma clang diagnostic push
    // 将undeclared selector警告识别为error
#pragma clang diagnostic error "-Wundeclared-selector"
    [self performSelector:@selector(noMethod) withObject:nil];
    // clang诊断pop,如果不pop,下面写的代码,也会将undeclared selector识别为error
#pragma clang diagnostic pop

  可以发现原本应该是警告的被识别为错误了:


忽略警告

  同样如果我们希望一个警告在编译的时候,不被识别为警告,我们就可以对警告进行忽略,下面同样以undeclared selector警告为例:

#pragma clang diagnostic push
    // 忽略undeclared selector的警告
#pragma clang diagnostic ignored "-Wundeclared-selector"
    [self performSelector:@selector(noMethod) withObject:nil];
#pragma clang diagnostic pop

组合

  实际上,clang diagnostic并不只有上面的两种固定用法,error:警告识别为错误还是ignored:忽略警告都可以根据自己的需求进行选择。
  而警告的类型也不止-Wundeclared-selector:undeclared selector一种,其他的比如:

-Wdeprecated-declarations      废弃的方法
-Wincompatible-pointer-types  指针类型不匹配
-Warc-retain-cycles                  Block的循环引用
-Wunused-variable                   未使用的变量

  如果上面这些都不是你想要的,下面来个全集吧:http://fuckingclangwarnings.com/
  同样#pragma clang diagnostic也可以写成#pragma GCC diagnostic,clang和GCC都是前端编译器,不过clang是苹果专门为mac系统做的。

相关文章

网友评论

    本文标题:iOS中#pragma clang diagnostic的常见用

    本文链接:https://www.haomeiwen.com/subject/abcseftx.html