首页 > 技术文章 > C实现JAVA类似ArrayList的静态链接库

biaoJM 2018-10-11 17:22 原文

文件结构:

  • ArrayList.h:头文件
  • ArrayList.c:实现头文件中的功能
  • ArrayListTest.c:测试

ArrayList.h

头文件的基本框架:

#ifndef _ARRAYLIST_H
#define _ARRAYLIST_H
// 头文件体
#endif

头文件中应包含结构体定义,必要的宏定义,需要直接在其他文件中使用的函数的定义

Java中的ArrayList是实现引用的数组,而不是对象的数组,在连续的存储空间中存放的是引用,而不是对象实体,所以在实现的时候采用void**,那么这样实现的ArrayList将可以含有任意类型的变量,坏处就是需要在使用的时候人为的解析

capacity是当前item_list申请的长度

my_size是当前item_list中存放了多少个元素。之所以不用size是为了和接下来实现的size函数区别

为实现通过结构体通过调用成员的方式调用函数,而不是直接通过函数名调用函数。在结构体中声明函数指针用以调用函数。这样就可以在ArrayList.c中将函数的作用域声明为只有本文件可见,避免和其他库函数函数名冲突。但是因为结构体中包含这个文件中函数的指针,仍然可以调用函数。

typedef struct ArrayList ArrayList;
struct ArrayList{
    void** item_list;
    int capacity;
    int my_size;

    // 函数指针
}

为实现函数指针的赋值,需要声明初始化函数,在初始化函数中将函数指针赋值,所以这两个函数就不能放到结构体中:

// create a new ArrayList
int init_ArrayList(ArrayList*);
// create a new ArrayList with specified capacity
int init_ArrayList_capacity(ArrayList*,int capacity);

ArrayList.c

包含头文件,实现函数

因为这些函数无法知道是哪个结构体调用自己的,所以都需要将调用的结构体传进去

ArrayListTest.c

包含头文件

调用的方式类似:

al.retainAll(&al,aap+3,11);
al.trimToSize(&al);

源码地址:

https://github.com/biaoJM/C-Wheel-ArrayList

推荐阅读