一:计算结构体成员变量偏移量宏

#ifdef LW_OOPC_USE_USER_DEFINED_OFFSETOF
// 有些环境可能不支持,不过,这种情形极少出现
#define LW_OOPC_OFFSETOF(s,m) (size_t)&(((s*)0)->m)
#endif

二:INTERFACE接口:接口(interface)是我们java里的一个关键字,接口只能定义抽象方法不能实现方法,接口就是一种特殊的abstract class,但是比abstract class更加抽象。

INTERFACE(type) :用来声明一个type型的的接口,并且声明相关函数。

#define INTERFACE(type)             \
typedef struct type type; \
void type##_ctor(type* t); \
int type##_dtor(type* t); \
struct type

三:抽象类ABS_CLASS:抽象类既可以定义抽象方法,也可以实现方法。

ABS_CLASS(type):用来声明一个type型的的抽象类,并且声明相关函数。

#define ABS_CLASS(type)             \
typedef struct type type; \
void type##_ctor(type* t); \
int type##_dtor(type* t); \
void type##_delete(type* t); \
struct type

四:类CLASS:类用来构造方法。

CLASS(type):用来声明一个type型的的类,并且声明相关函数。指针的所占内存大小是恒定的,32位为4字节。

#define CLASS(type)                 \
typedef struct type type; \
type* type##_new(lw_oopc_file_line_params); \
void type##_ctor(type* t); \
int type##_dtor(type* t); \
void type##_delete(type* t); \
struct type

五:构造类CTOR

CTOR(type)  :用来初始化一个类,即为这个类分配内存空间。

END_CTOR:构造结束。

#ifdef LW_OOPC_SUPPORT_MEMORY_LEAK_DETECTOR
#define CTOR(type) \
type* type##_new(const char* file, int line) { \
struct type *cthis; \
cthis = (struct type*)lw_oopc_malloc(sizeof(struct type), #type, file, line); \
if(!cthis) \
{ \
return ; \
} \
type##_ctor(cthis); \
return cthis; \
} \
\
void type##_ctor(type* cthis) {
#else
#define CTOR(type) \
type* type##_new() { \
struct type *cthis; \
cthis = (struct type*)malloc(sizeof(struct type)); \
if(!cthis) \
{ \
return ; \
} \
type##_ctor(cthis); \
return cthis; \
} \
\
void type##_ctor(type* cthis) {
#endif #define END_CTOR }

六:DTOR:用来支持析构的概念。

DTOR(type) :释放一个类的内存空间。

END_DTOR:析构结束。

#define DTOR(type)                  \
void type##_delete(type* cthis) \
{ \
if(type##_dtor(cthis)) \
{ \
lw_oopc_free(cthis);\
} \
} \
int type##_dtor(type* cthis) \
{ #define END_DTOR }

注意:这里的int type##_dtor(type* cthis)是释放内存的函数,是由我们自己实现的。而与构造类里的void type##_ctor(type* cthis)不同,type##_ctor(type* cthis)实现方法是调用下面定义的一些宏。

七:ABS_CTOR:用来构造可被继承的抽象类。

ABS_CTOR(type):用来初始化一个抽象类(基类)

END_ABS_CTOR:抽象类初始化结束。

#define ABS_CTOR(type)              \
void type##_ctor(type* cthis) { #define END_ABS_CTOR }

八:FUNCTION_SETTING:关联类里的函数指针。

FUNCTION_SETTING(f1, f2):对于抽象类既可以实现抽象方法,也可以实现具体的方法。对于具体的类实现具体的方法。

#define FUNCTION_SETTING(f1, f2)    cthis->f1 = f2;

九:#define IMPLEMENTS(type) struct type type和#define EXTENDS(type) struct type type都是用来实现继承的。

相当于在一个结构体里嵌套类另一个结构体(相当于父类)。

十:  #define SUPER_PTR(cthis, father) ((father*)(&(cthis->father)))

  #define SUPER_PTR_2(cthis, father, grandfather) \
  SUPER_PTR(SUPER_PTR(cthis, father), grandfather)

  #define SUPER_PTR_3(cthis, father, grandfather, greatgrandfather) \
  SUPER_PTR(SUPER_PTR_2(cthis, father, grandfather), greatgrandfather)

该结构体指向其里面的另一个结构体(相当于父类),并且将其类型转换为父类指针,用于实例化方法。

十一:#define SUPER_CTOR(father)  father##_ctor(SUPER_PTR(cthis, father));

将继承类转换为被继承类,为了支持子类调用父类的构造函数。和第十点意思相同。

十二:#define SUB_PTR(selfptr, self, child) \

  ((child*)((char*)selfptr - LW_OOPC_OFFSETOF(child, self)))

  #define SUB_PTR_2(selfptr, self, child, grandchild) \
  SUB_PTR(SUB_PTR(selfptr, self, child), child, grandchild)

  #define SUB_PTR_3(selfptr, self, child, grandchild, greatgrandchild) \
  SUB_PTR(SUB_PTR_2(selfptr, self, child, grandchild), grandchild, greatgrandchild)

  现在不知道具体作用

十三:#define INHERIT_FROM(father, cthis, field) cthis->father.field

用来访问子类成员。

#define ABS_CTOR(type)              \
void type##_ctor(type* cthis) { #define END_ABS_CTOR } #define FUNCTION_SETTING(f1, f2) cthis->f1 = f2; #define IMPLEMENTS(type) struct type type #define EXTENDS(type) struct type type #define SUPER_PTR(cthis, father) ((father*)(&(cthis->father))) #define SUPER_PTR_2(cthis, father, grandfather) \
SUPER_PTR(SUPER_PTR(cthis, father), grandfather) #define SUPER_PTR_3(cthis, father, grandfather, greatgrandfather) \
SUPER_PTR(SUPER_PTR_2(cthis, father, grandfather), greatgrandfather) #define SUPER_CTOR(father) \
father##_ctor(SUPER_PTR(cthis, father)); #define SUB_PTR(selfptr, self, child) \
((child*)((char*)selfptr - LW_OOPC_OFFSETOF(child, self))) #define SUB_PTR_2(selfptr, self, child, grandchild) \
SUB_PTR(SUB_PTR(selfptr, self, child), child, grandchild) #define SUB_PTR_3(selfptr, self, child, grandchild, greatgrandchild) \
SUB_PTR(SUB_PTR_2(selfptr, self, child, grandchild), grandchild, greatgrandchild) #define INHERIT_FROM(father, cthis, field) cthis->father.field

lw_oopc(c语言实现面向过程宏文件)解析的更多相关文章

  1. 为什么大一先要学C语言(面向过程)再学C++或JAVA(面向对象)?

    面向对象和面向过程各有千秋 一.面向过程与面向对象对比  面向过程:强调的是每一个功能的步骤,有很多很多方法组成,这些方法相互调用,完成需求. 面向对象:强调的是对象,然后由对象去调用功能. 面向过程 ...

  2. 数学语言和程序语言的对比:面向过程与面向集合&命题

    共同之处:都使用字符串或数值来引用一个客观实体.当然数字和字符串也可以作为实体对象,这取决于人的解释. 不同之处:数学语句每一行都给出了一个结论, 程序语句的每一行都定义了一个过程.注意这里所指的程序 ...

  3. Python笔记_第一篇_面向过程_第一部分_2.内存详解

    Python的很多教材中并没有讲内存方面的知识,但是内存的知识非常重要,对于计算机工作原理和方便理解编程语言是非常重要的,尤其是小白,因此需要把这一方面加上,能够更加深入的理解编程语言.这里引用了C语 ...

  4. Android-Java-面向对象与面向过程的简单理解

    支持面向过程的语言有:C  Basic 等语言: 支持面向对象的语言有:C++  Java  C# 等语言: 面向过程:操作的是行为/功能: 面向对象:操作的是对象,而对象里面有功能行为,所以可以指定 ...

  5. 【C++系列小结】面向过程的编程风格

    前言 编程语言有面向过程和面向对象之分,因此编程风格也有所谓的面向过程的编程和面向对象的编程,并且语言的性质不会限制编程的风格. 这里主要说一以下向过程的编程. "面向过程"(Pr ...

  6. atitit.面向过程的编程语言异常处理 c语言 asp vbs 的try catch 实现

    atitit.面向过程的编程语言异常处理 c语言 asp vbs 的try catch 实现 1. 返回值法.and全局ERROR 变量法 1 2. 抛出异常Err.Raise 1 3. 实现try  ...

  7. C语言学习系列(二)面向过程和面向对象

    一.基本定义 (一).面向过程(procedure oriented programming POP) 面向过程是分析解决问题的步骤,然后用函数把这些步骤一步一步的实现,然后在使用的时候一一调用则可. ...

  8. python之旅:迭代器、生成器、面向过程编程

    1.什么是迭代器? 1.什么是迭代器 迭代的工具 什么是迭代? 迭代是一个重复的过程,每一次重复都是基于上一次结果而进行的 # 单纯的重复并不是迭代 while True: print('=====& ...

  9. 如何从普通程序员晋升为架构师 面向过程编程OP和面向编程OO

    引言 计算机科学是一门应用科学,它的知识体系是典型的倒三角结构,所用的基础知识并不多,只是随着应用领域和方向的不同,产生了很多的分支,所以说编程并不是一件很困难的事情,一个高中生经过特定的训练就可以做 ...

随机推荐

  1. Linux、Ubuntu、CentOS安装和配置zsh

    目录 01 zsh的安装 02 配置zsh 2.1 安装oh-my-zsh 2.2 查看oh-my-zsh目录 2.3 oh-my-zsh 插件的管理 2.3.1 添加插件 2.3.2 zsh-aut ...

  2. 05 . Python入门值循环语句

    一.Python循环语句 程序一般情况下是按照顺序执行的 编程语言提供了各种控制结构,允许更复杂的执行路径 Python中的循环语句有for和while但没有do while 循环语句允许我们执行一个 ...

  3. chrome和Firefox浏览器渲染页面的不同

    一直很好奇chrome和firefox这两大浏览器的页面渲染有什么不同,今天自己写了些html代码来做了下检验. 先做html编码,代码如下: <!DOCTYPE html><htm ...

  4. 高性能可扩展mysql 笔记(二)用户模型设计、用户实体表结构设计、设计范式

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.用户模型设计 电商羡慕中用户模型的设计涉及以下几个部分: ​ 以电商平台京东的登录.注册页面作为例: ...

  5. Java实现蓝桥杯VIP算法训练 最大获利

    试题 算法训练 最大获利 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 Chakra是一位年轻有为的企业家,最近他在进军餐饮行业.他在各地开拓市场,共买下了N个饭店.在初期的市场调 ...

  6. java实现复制网站内容

    复制网站内容 复制代码 本程序将网站"www.baidu.com"首页的内容复制保存在文件test.html中.写了如下代码,请完善之: import java.net.*; im ...

  7. java实现第四届蓝桥杯空白格式化

    空白格式化 本次大赛采用了全自动机器测评系统. 如果你的答案与标准答案相差了一个空格,很可能无法得分,所以要加倍谨慎! 但也不必过于惊慌.因为在有些情况下,测评系统会把你的答案进行"空白格式 ...

  8. (四)rsync未授权访问

    01 漏洞描述 rsync是Linux/Unix下的一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件和目录,默认运行在873端口.由于配置不当,导致任何人可未授权访问rsync,上传 ...

  9. Linux的文件系统及文件缓存知识点整理

    Linux的文件系统 文件系统的特点 文件系统要有严格的组织形式,使得文件能够以块为单位进行存储. 文件系统中也要有索引区,用来方便查找一个文件分成的多个块都存放在了什么位置. 如果文件系统中有的文件 ...

  10. NetAnalyzer笔记 之 十四 NetAnalyzer 6.0 的使用方法 -- 3.协议分析与统计

    数据分析 完成了数据的抓取,那么接下来就是NetAnalyzer的第二个重点部分了,协议分析作为整个软件的核心之一,在最新的NetAnalyzer中已经得到了巨大的提升.NetAnalyzer中协议分 ...