c语言tmp有头文件吗,浅析YYKit(base 篇)之头文件解析 1-tmp是什么文件

2024-02-13 01:50

本文主要是介绍c语言tmp有头文件吗,浅析YYKit(base 篇)之头文件解析 1-tmp是什么文件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

yykit 是最近一个很火的开源框架,今天来研究看看yykit源码和一些原理,刚拿到yykit还是 很惊讶,来看看yykit 的目录,功能不仅强大,而且是十分全面的,我们来看看他的目录结构

75f01a08abd9a46a7f8cc8a2647c49a5.png

EA102D35-DD95-4EFA-8098-325B855E8CE7.png

不得不惊叹,真的好全面,一篇文章根本看不完,今天还是先从base 说起吧,

567b8389d08e130618f45b4c8b27ee76.png

09ECF4C2-6F37-40F8-BCBB-EEAD1AE9C19F.png

展开base 也是不少东西,先来看看这个头文件定义了什么吊炸天的东西

一开始看就尼玛就卡主了,#ifdef __cplusplus#define YY_EXTERN_C_BEGIN extern "C" {#define YY_EXTERN_C_END }#else#define YY_EXTERN_C_BEGIN#define YY_EXTERN_C_END#endif

这是什么鬼啊,各种百度,google之后总算是有些眉目了

先看 #ifdef cplusplus google 之后发现 c++中定义了cplusplus,C语言中没有该定义。即这个是用来:识别是c代码还是c++代码

在看EXTERN_C ,调用extern "C"会让c++编译器按照c的编译格式来编译。多用于c++库的头文件。 也即是说这个在c++的环境下,会强制编译器用 C 语言的规则去编译,而不是用 C++ 语言的规则。。因为 C++ 为了实现函数重载会把函数名和参数等联合起来合成一个中介的函数名,如果 C 函数也被这样编译会出问题,所以在我看来这个是为了兼容c++环境不会编译报错。

好吧解决了这个 在往下看看有什么比较难理解的东西

接下来是一个两重判断的 宏定义#ifndef YY_CLAMP // return the clamped value#define YY_CLAMP(_x_, _low_, _high_) (((_x_) > (_high_)) ? (_high_) : (((_x_) < (_low_)) ? (_low_) : (_x_)))#endif

咋一看不知道有什么用写成if else 语句大概是 if(x>high) return high; else

{ if(x

return x;

}

好吧接下来往下看吧#ifndef YY_SWAP // swap two value#define YY_SWAP(_a_, _b_) do { __typeof__(_a_) _tmp_ = (_a_); (_a_) = (_b_); (_b_) = _tmp_; } while (0)#endif

虽然这个一眼就看出来是个交换 函数还是有两个地方需要注意的为什么要用这个关键字呢typeof 还有为什么要用do while 直接用if else 不是就行了吗

百度一下你就知道typeof(var) 是gcc对C语言的一个扩展保留字,用于声明变量类型,var可以是数据类型(int, char*..),也可以是变量表达式。也即是说 变量a 还可以是个变量表达式这里吊吊的

,但为啥要用do while 这里就请众大神指点迷津了。

就不一一解析,看一些比较特别的吧#ifndef YYSYNTH_DUMMY_CLASS#define YYSYNTH_DUMMY_CLASS(_name_) \@interface YYSYNTH_DUMMY_CLASS_ ## _name_ : NSObject @end \@implementation YYSYNTH_DUMMY_CLASS_ ## _name_ @end#endif

这一段还是挺特别的, 但oc 编译静态库 要在build setting other linker flag设置 -all_load 和-Objc才可以将category 编进去

使用这段宏定义他可以虚拟新建一个与名字category 相同.h.m 让编译器 编译通过

但是每次要对所有category 都要申明这个的话可能会比较麻烦,直接加-all_load 据官方文档说,它可以使生成的可执行文件较大,并且产生一些不需要的文件#ifndef YYSYNTH_DYNAMIC_PROPERTY_OBJECT#define YYSYNTH_DYNAMIC_PROPERTY_OBJECT(_getter_, _setter_, _association_, _type_) \- (void)_setter_ : (_type_)object { \

[self willChangeValueForKey:@#_getter_]; \

objc_setAssociatedObject(self, _cmd, object, OBJC_ASSOCIATION_ ## _association_); \

[self didChangeValueForKey:@#_getter_]; \} \

- (_type_)_getter_ { \ return objc_getAssociatedObject(self, @selector(_setter_:)); \

}#endif//调用的方法 @interface NSObject (MyAdd) @property (nonatomic, retain) UIColor *myColor; @end

#import @implementation NSObject (MyAdd)

YYSYNTH_DYNAMIC_PROPERTY_OBJECT(myColor, setMyColor, RETAIN, UIColor *) @end

使用runtime 运行时属性 给catetory 动态添加属性

文/嘿晴天(简书作者)

原文链接:http://www.jianshu.com/p/a5acbed59ef3

这篇关于c语言tmp有头文件吗,浅析YYKit(base 篇)之头文件解析 1-tmp是什么文件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/704163

相关文章

Go语言连接MySQL数据库执行基本的增删改查

《Go语言连接MySQL数据库执行基本的增删改查》在后端开发中,MySQL是最常用的关系型数据库之一,本文主要为大家详细介绍了如何使用Go连接MySQL数据库并执行基本的增删改查吧... 目录Go语言连接mysql数据库准备工作安装 MySQL 驱动代码实现运行结果注意事项Go语言执行基本的增删改查准备工作

深度解析Python yfinance的核心功能和高级用法

《深度解析Pythonyfinance的核心功能和高级用法》yfinance是一个功能强大且易于使用的Python库,用于从YahooFinance获取金融数据,本教程将深入探讨yfinance的核... 目录yfinance 深度解析教程 (python)1. 简介与安装1.1 什么是 yfinance?

Go语言使用Gin处理路由参数和查询参数

《Go语言使用Gin处理路由参数和查询参数》在WebAPI开发中,处理路由参数(PathParameter)和查询参数(QueryParameter)是非常常见的需求,下面我们就来看看Go语言... 目录一、路由参数 vs 查询参数二、Gin 获取路由参数和查询参数三、示例代码四、运行与测试1. 测试编程路

99%的人都选错了! 路由器WiFi双频合一还是分开好的专业解析与适用场景探讨

《99%的人都选错了!路由器WiFi双频合一还是分开好的专业解析与适用场景探讨》关于双频路由器的“双频合一”与“分开使用”两种模式,用户往往存在诸多疑问,本文将从多个维度深入探讨这两种模式的优缺点,... 在如今“没有WiFi就等于与世隔绝”的时代,越来越多家庭、办公室都开始配置双频无线路由器。但你有没有注

Python中的sort()和sorted()用法示例解析

《Python中的sort()和sorted()用法示例解析》本文给大家介绍Python中list.sort()和sorted()的使用区别,详细介绍其参数功能及Timsort排序算法特性,涵盖自适应... 目录一、list.sort()参数说明常用内置函数基本用法示例自定义函数示例lambda表达式示例o

Go语言使用net/http构建一个RESTful API的示例代码

《Go语言使用net/http构建一个RESTfulAPI的示例代码》Go的标准库net/http提供了构建Web服务所需的强大功能,虽然众多第三方框架(如Gin、Echo)已经封装了很多功能,但... 目录引言一、什么是 RESTful API?二、实战目标:用户信息管理 API三、代码实现1. 用户数据

SpringBoot加载profile全面解析

《SpringBoot加载profile全面解析》SpringBoot的Profile机制通过多配置文件和注解实现环境隔离,支持开发、测试、生产等不同环境的灵活配置切换,无需修改代码,关键点包括配置文... 目录题目详细答案什么是 Profile配置 Profile使用application-{profil

MySQL的触发器全解析(创建、查看触发器)

《MySQL的触发器全解析(创建、查看触发器)》MySQL触发器是与表关联的存储程序,当INSERT/UPDATE/DELETE事件发生时自动执行,用于维护数据一致性、日志记录和校验,优点包括自动执行... 目录触发器的概念:创建触www.chinasem.cn发器:查看触发器:查看当前数据库的所有触发器的定

Go语言网络故障诊断与调试技巧

《Go语言网络故障诊断与调试技巧》在分布式系统和微服务架构的浪潮中,网络编程成为系统性能和可靠性的核心支柱,从高并发的API服务到实时通信应用,网络的稳定性直接影响用户体验,本文面向熟悉Go基本语法和... 目录1. 引言2. Go 语言网络编程的优势与特色2.1 简洁高效的标准库2.2 强大的并发模型2.

Java中的volatile关键字多方面解析

《Java中的volatile关键字多方面解析》volatile用于保证多线程变量可见性与禁止重排序,适用于状态标志、单例模式等场景,但不保证原子性,相较synchronized更轻量,但需谨慎使用以... 目录1. volatile的作用1.1 保证可见性1.2 禁止指令重排序2. volatile的使用