#if#ifdef#define等宏定义使⽤
最近碰到了个代码执⾏问题,iOS 11中⼀些新的API在xdode8中报错,每次切换xcode时,都得去注释掉这段代码,⿇烦死了。怎么让⼀段代码在xcode8和9都能顺利编译不报错,可⽤宏做如下设置:
#import "UIScrollView+SFScrollView.h”
@implementation UIScrollView (SFScrollView)
- (void)neverAdjustmentContentInset{
#ifdef __IPHONE_11_0
if (@available(iOS 11.0, *) ) {
}
define的基本用法#endif
}
@end
//> scrollview的分类中添加的⽅法,是iOS 11才有的。⽽宏__IPHONE_11_0,也是iOS 11才有的,故⽤#ifdef __IPHONE_11_0即可完美解决,
整理⼀下,⽅便使⽤:
预处理就是在进⾏编译的第⼀遍词法扫描和语法分析之前所作的⼯作。说⽩了,就是对源⽂件进⾏编译前,先对预处理部分进⾏处理,然后对处理后的代码进⾏编译。这样做的好处是,经过处理后的代码,将会变的很精短。
#define  定义⼀个预处理宏
#undef  取消宏的定义
#if      编译预处理中的条件命令,相当于C语法中的if语句
#ifdef  判断某个宏是否被定义(#define过),若已定义,执⾏随后的语句
#ifndef  与#ifdef相反,判断某个宏是否未被定义
#elif    若#if,#ifdef,#ifndef或前⾯的#elif条件不满⾜,则执⾏#elif之后的语句,相当于C语法中的else-if
#else    与#if,#ifdef,#ifndef对应,若这些条件不满⾜,则执⾏#else之后的语句,相当于C语法中的else
#endif  #if,#ifdef,#ifndef这些条件命令的结束标志.
defined  与#if,#elif配合使⽤,判断某个宏是否被定义
#pragma  说明编译器信息
#warning 显⽰编译警告信息
#error  显⽰编译错误信息
配置DEBUG宏:
1.在 "Target > Build Settings > Preprocessor Macros > Debug" 设置"DEBUG=1”。
2.之后在pch或⼯具类中就可以这么写了:
#ifdef DEBUG
(debug 模式下的配置)
#else
(release 模式下的配置)
#endif
#ifdef DEBUG // 调试状态, 打开LOG功能
#define SFString [NSString stringWithFormat:@"%s", __FILE__].lastPathComponent
//打印出所在⽂件名,所在⾏,堆栈地址
#define SFLog(...) printf("%s: %p (line = %d): %s\n\n", [SFString UTF8String] , &self, __LINE__, [[NSString stringWithFormat:__VA_ARGS__] UTF8String]);
//#else
//#define SFLog(s, ...) NSLog(@"<%@: %p (line = %d)> %@", self.class, self, __LINE__,[NSString stringWithFormat:(s),##__VA_ARGS__])
//#endif
#else // 发布状态, 关闭LOG功能
#define SFLog(s, ...)
#endif
系统宏介绍:
__LINE__:宏在预编译时会替换成当前的⾏号
__FUNCTION__:宏在预编译时会替换成当前的函数名称
__VA_ARGS__:简单的说,就是将左边…的内容替换进来
详解#ifdef,#elif,#else,#endif,#if等:
1:
  #ifdef _XXXX  (ifdef 即 if define )
  ...程序段1...
#elif defined _YYYY
...程序段3...(相当于else if)
  #else
  ...程序段2...
  #endif
>这表明如果_XXXX已被#define定义过,则对程序段1进⾏编译;再如果定义了_YYYY,执⾏程序段3,否则对程序段2进⾏编译。
  例:
  #define NUM
  .............
  #ifdef NUM
  printf("之前NUM有过定义啦!:) \n");
  #else
  printf("之前NUM没有过定义!:( \n");
  #endif
>如果程序开头有#define NUM这⾏,即NUM有定义,碰到下⾯#ifdef NUM的时候,当然执⾏第⼀个printf。否则第⼆个printf将被执⾏。  我认为,⽤这种,可以很⽅便的开启/关闭整个程序的某项特定功能。
2:
  #ifndef _XXXX
  ...程序段1...
  #else
  ...程序段2...
  #endif
>这⾥使⽤了#ifndef,表⽰的是if not def。和#ifdef相反的状况(如果没有定义了标识符_XXXX,那么执⾏程序段1,否则执⾏程序段2)
3:
  #if 常量
  ...程序段1...
  #else
  ...程序段2...
  #endif
>注意:#if后必须跟常量,不能是宏(因为宏是在运⾏阶段才有,#if是预编译阶段,不到宏);
如果常量为真(⾮0,随便什么数字,只要不是0),就执⾏程序段1,否则执⾏程序段2。
 我认为,这种⽅法可以将测试代码加进来。当需要开启测试的时候,只要将常量变1就好了。⽽不要测试的时候,只要将常量变0。
常⽤⽰例:
1.判断当前app所⽀持的最⼤最⼩iOS版本
#ifdef __IPHONE_OS_VERSION_MAX_ALLOWED // 当前软件⽀持的最⼤ios版本
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 90000
NSLog(@"当前app⽀持的最⼤版本,%d",__IPHONE_OS_VERSION_MAX_ALLOWED);
#else
NSLog(@"当前app⽀持的最⼤版本,%d",__IPHONE_OS_VERSION_MAX_ALLOWED);
#endif
#endif
#ifdef __IPHONE_OS_VERSION_MIN_REQUIRED // 当前软件⽀持的最⼩ios版本
#if __IPHONE_OS_VERSION_MIN_REQUIRED < 80400
NSLog(@"当前app⽀持的最⼩版本,%d",__IPHONE_OS_VERSION_MIN_REQUIRED);
#else
NSLog(@"当前app⽀持的最⼩版本,%d",__IPHONE_OS_VERSION_MIN_REQUIRED);
#endif
#endif
2.判断真机/模拟器
#if TARGET_OS_IOS
NSLog(@"真机测试");
#endif
#if TARGET_IPHONE_SIMULATOR
NSLog(@"模拟器");
#endif
3.获得当前设备的iOS版本
#define kIOSVersion  [[UIDevice currentDevice].systemVersion doubleValue]
4.字体(带参数的宏)
#define SFSystemFont(FONTSIZE) [UIFont systemFontOfSize:FONTSIZE]
5.weak strong (RAC写法)
// weak self
#ifndef weakify
#if DEBUG
#if __has_feature(objc_arc)
#define weakify(object) autoreleasepool{} __weak __typeof__(object) weak##_##object = object;
#else
#define weakify(object) autoreleasepool{} __block __typeof__(object) block##_##object = object;
#endif
#else
#if __has_feature(objc_arc)
#define weakify(object) try{} @finally{} {} __weak __typeof__(object) weak##_##object = object;
#else
#define weakify(object) try{} @finally{} {} __block __typeof__(object) block##_##object = object;
#endif
#endif
#endif
// strong self
#ifndef strongify
#if DEBUG
#if __has_feature(objc_arc)
#define strongify(object) autoreleasepool{} __typeof__(object) object = weak##_##object;
#else
#define strongify(object) autoreleasepool{} __typeof__(object) object = block##_##object;
#endif
#else
#if __has_feature(objc_arc)
#define strongify(object) try{} @finally{} __typeof__(object) object = weak##_##object;
#else
#define strongify(object) try{} @finally{} __typeof__(object) object = block##_##object;
#endif
#endif
#endif
6.去警告
#define SuppressPerformSelectorLeakWarning(Stuff) \
do { \
_Pragma("clang diagnostic push") \
_Pragma("clang diagnostic ignored \"-Warc-performSelector-leaks\"") \
Stuff; \
_Pragma("clang diagnostic pop") \
} while (0)
7.GCD Block
#define GCDBlock(block) dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), block) #define GCDMainBlock(block) dispatch_async(dispatch_get_main_queue(),block)
#define CGDMainBack GCDMainBlock(^(){})
作者:DonnyDD
链接:www.jianshu/p/8ec776dc4e5d
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,⾮商业转载请注明出处。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。