

宏定义是C提供的三个预处理功能之一. 这三个预处理包括: 宏定义内联函数 宏,文件包含和条件编译.
格式: #define标识符字符串
说明:
(1)宏名称通常使用大写字母
(2)宏的使用可以提高程序的通用性和可读性,减少不一致性,减少输入错误并便于修改. 例如: 数组大小的通用宏定义
(3)预处理是在编译之前进行的处理,编译工作的任务之一是语法检查,而预处理不进行语法检查.
(4)宏定义的末尾没有分号;
(5)宏定义写在函数的花括号之.
(6)您可以使用#undef命令终止宏定义的范围
(7)可以嵌套宏定义
(8)字符串“”将永远不包含宏

(9)宏定义不分配内存,变量定义分配内存.
除了常规的字符串替换外,还需要参数替换
格式: #define宏名称(参数表)字符串
例如: #define S(a,b)a * b
(1)如果实际参数是一个表达式,很容易出错
(2)宏名称和参数的括号之间不能有空格
(3)宏替换仅用于替换,无计算,无表达式解决方案
(4)在编译后程序运行并分配内存时进行函数调用. 宏替换是在编译之前完成的,没有分配内存
(5)宏的愚蠢组合没有类型,也没有类型转换.
(6)该函数只有一个返回值,您可以尝试使用宏获取多个值
(7)宏扩展使源程序更长内联函数 宏,并且函数调用不会
(8)宏扩展不占用运行时间,仅占用编译时间,而函数调用占用运行时间(分配内存,保留场景,值传递,返回值)

如上所述,宏定义主要分为参数宏和非参数宏. 接下来,让我们看一下我们在iOS开发过程中常用的一些宏定义.
//主屏幕的宽高
#define KmainHight [UIScreen mainScreen].bounds.size.height
#define KmainWidth [UIScreen mainScreen].bounds.size.width
//导航栏高度
#define KnavigationBarHeight (44)
//标签栏高度
#define KtabBarHeight (49)
//普通颜色
#define KmyColor(R,G,B) [UIColor colorWithRed:R/255.0 green:G/255.0 blue:B/255.0 alpha:1.0]
// 随机颜色
#define KrandomColor [UIColor colorWithRed:arrandom_uniform(256) / 255.0 green:arrandom_uniform(256) / 255.0 blue:arrandom_uniform(256) / 255.0 alpha:1]
//获取当前语言
#define KcurrentLanguage ([[NSLocale preferredLanguages] objectAtIndex:0])
//主要用于判断当前iOS版本号,对其弃用或者未出现的方法进行区别对待
#define KcurrentSystemVersion [[UIDevice currentDevice] systemVersion]
//iPhone5
#define IPHONE5 ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(640, 1136), [[UIScreen mainScreen] currentMode].size) : NO)
//iPhone6
#define IPHONE6 ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(750, 1334), [[UIScreen mainScreen] currentMode].size) : NO)
//iPhone6 Plus
#define IPHONE6_Plus ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(1242, 2208), [[UIScreen mainScreen] currentMode].size) : NO)
//Pad
#define KisPad (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
/判断是真机还是模拟器
#if TARGET_OS_IPHONE
//真机
#endif
#if TARGET_IPHONE_SIMULATOR
//模拟器
#endif
#define LocalString(string) NSLocalizedString(string, nil)
//弱引用
#define KweakSelf(type) __weak typeof(type) weak##type = type;
//强引用
#define KstrongSelf(type) __strong typeof(type) type = weak##type;
//获取沙盒主路径
#define KhomePath NSHomeDirectory()
//获取沙盒 Temp
#define KtempPath NSTemporaryDirectory()
//获取沙盒 Document
#define KdocumentPath [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]
//获取沙盒 Cache
#define KcachePath [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject]
//对象打印
#define KobjectLog(object) NSLog(@"%@",(object));
//整型数字打印
#define KintNumberLog(number) NSLog(@"%d",(number));
//float数字打印
#define KfloatNumberLog(number) NSLog(@"%f",(number));
// 自定义NSLog,在debug模式下打印,在release模式下取消一切NSLog(上线时候使用推荐:⭐️⭐️⭐️⭐️⭐️)
#ifdef DEBUG
#define NSLog(FORMAT, ...) fprintf(stderr,"%s:%d\t%s\n",[[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String], __LINE__, [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]);
#else
#define NSLog(FORMAT, ...) nil
#endif

当我第一次接触内联函数时,我以为内向函数是宏定义. 后来,在杜娘的周期性教学之后,我意识到内联函数还有其他事情.
为什么要使用内联函数?实际上,主要原因是宏定义简单易懂,但容易出错. 让我们用例子来说明.
例如,下面的宏定义实际上非常简单,它是比较两个数字的大小.
#define Kmax(a, b) (a) > (b) ? (a) : (b)
然后我们这样称呼
int result = Kmax(i, j) + 2 ;
实际上,事实证明
result = (i) > (j) ? (i) : (j) + 2 ;
我们需要的是
result = ( (i) > (j) ? (i) : (j) ) + 2 ;
这与我们需要的期望相距一千英里. ...嗯,这时有人说,进行以下更改不会有问题吗?但是真的没有问题吗?<
#define Kmax(a, b) ((a) > (b) ? (a) : (b))

上面的修改确实可以解决上面的问题,但是我们如下使用它,仍然存在问题
result = Kmax(i++, j);
然后预处理将按以下方式进行,这仍然与我们的预期结果不一致...
result = (i++) > (j) ? (i++) : (j);
看到上面有很多问题,我相信你的头和我的一样大,这就是我们的猪脚--->内联函数可以解决问题,让我们看一下内联函数的结构.
采用上述比较方法,我们可以将其直接写入PCH文件中. 代码如下. (注意: NS_INLINE是内联函数的符号,要使用内联函数,需要导入Foundation框架. )这是上述问题的完美解决方案.
#import <Foundation/Foundation.h>
NS_INLINE int max( int a ,int b){
return a>b?a:b;
}
以下是共享给所有人的内联函数的应用程序,这是一个自定义内联函数弹出窗口. (注意: 由于不推荐使用UIAlertView的问题,它会变成,但是它确实很容易使用,因此只需共享它即可).
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
NS_INLINE void tipWithMessage(NSString *message){
dispatch_async(dispatch_get_main_queue(), ^{
UIAlertView *alerView = [[UIAlertView alloc] initWithTitle:@"提示" message:message delegate:nil cancelButtonTitle:nil otherButtonTitles:nil, nil];
[alerView show];
[alerView performSelector:@selector(dismissWithClickedButtonIndex:animated:) withObject:@[@0, @1] afterDelay:0.9];
});
}
下面的调用也非常简单,如下所示-在-(void)touchesBegan: (NSSet
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
tipWithMessage(@"世界,你好!");
}
以下是效果图.
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-280125-1.html
人家都是拿
豆浆精之类都是以不含防腐剂
就h的唱功