TBOX中提供了各种列表操作:
由于双链和单链的接口使用类似,这里主要就讲解双链的具体使用。
那什么是内部维护和外部维护呢? 简单地说:
外部维护:就是链表容器本身不存储元素,不开辟内存空间,仅仅是一个节点头,这样比较节省内存,更加灵活。(尤其是在多个链表间元素迁移的时候,或者多个链表需要统一内存池维护的时候)。
内部维护:就是链表容器本身回去开辟一块空间,去单独存储元素内容,这种方式对接口的操作比较简单,但是灵活性和性能不如前一种,如果不需要多个链表维护同一种元素,那么使用这种模式简单操作下,更为妥当。(而且内部元素的存储也是用内存池优化过的)。
list的使用很简单,接口用起来也很方便,这里给个简单的例子:
// 创建一个long类型的双链,参数0表示采用默认的自动元素增长大小,也可以手动设置更适合的大小
tb_list_ref_t list = tb_list_init(0, tb_element_long());
if (list)
{
// 在链表头部插入元素:1,并返回这个新元素的迭代器索引
tb_size_t itor = tb_list_insert_head(list, (tb_pointer_t)1);
// 在之前新的元素后面插入一个新元素:2
tb_list_insert_next(list, itor, (tb_pointer_t)2);
// 在链表尾部插入元素:3
tb_list_insert_tail(list, (tb_pointer_t)3);
// 移除指定的元素
tb_list_remove(list, itor);
// 遍历所有链表元素,
tb_for_all(tb_long_t, item, list)
{
// 打印元素值
tb_trace_i("%ld", item);
}
// 销毁list
tb_list_exit(list);
}
xmake还可以支持一些自定义选项开关,使得工程支持可选编译,方便工程的模块化管理。
我们拿一个实际的例子来说:
我们想在自己的工程中增加一个新开关选项:hello, 如果这个开关被启用,会在target中添加特定的一些源码文件,但是这个开挂默认是不被启用的,需要通过配置xmake f --hello=true
才会被链接和使用
并且使用的时候,需要定义一些特殊的宏定义:-DHELLO_TEST -DHELLO_ENABLE
那么我们开始进行xmake.lua修改,过程并不复杂:
--定义一个名叫hello的开关选项,这个接口跟add_target是同级的,不要在add_target里面使用(使用了也没什么问题,只是不大好看)
option("hello")
-- 默认禁用这个开关,需要手动xmake f --hello=true才会启用,当然你也可以默认启用它
set_default(false)
-- 定义一些宏开关,这个只有在hello被启用的时候才会被定义
add_defines_if_ok("HELLO_ENABLE", "HELLO_TEST")
xmake不仅可以支持 c/c++文件,同时也支持 objc/c++,甚至swift代码的编译。
我们先看一下如何创建Swift工程,首先执行–help,看下帮助文档:
xmake create --help
有时候可能用到某个库的某些函数接口,但是这个库有可能在某个平台上被裁减过了,接口支持不全,如果你想跨平台使用,就会出问题
因此在使用之前进行检测是否存在这个函数,还是很有必要的,xmake提供了方便的api,可以批量检测某个库的一些函数:
例如:
target("test")
-- 检测libc库中,对宽字符操作的接口是否存在,检测条件:检查wchar.h、stdlib.h中是否有函数声明
add_cfuncs("libc", nil, {"wchar.h", "stdlib.h"}, "wcscat",
"wcsncat",
"wcscpy",
"wcsncpy",
"wcslcpy",
"wcslen",
"wcsnlen",
"wcsstr",
"wcscasestr",
"wcscmp",
"wcscasecmp",
"wcsncmp",
"wcsncasecmp",
"wcstombs",
"mbstowcs")
-- 检测pthread库中,是否存在pthread_mutex_init, pthread_create接口,相当于检测了pthread是否存在
-- 第一个参数是库类型、别名,可以随便写
add_cfuncs("posix", nil, "pthread.h", "pthread_mutex_init", "pthread_create")
-- 检测pthread库中,是否存在pthread_mutex_init, pthread_create接口,相当于检测了pthread是否存在
-- 这个检测更加严格,同时检测了libpthread.a静态库是否存在这个接口的定义,如果链接不通过,就检测失败
-- xmake会在检测时,尝试链接-lpthread
add_cfuncs("posix", "pthread", "pthread.h", "pthread_mutex_init", "pthread_create")
xmake将依赖库、依赖头文件、依赖类型、依赖接口统一用 option 选项机制进行了封装,更在上一层引入package包的机制,使得添加和检测依赖更加的模块化,简单化。。。
下面通过一个具体实例,来看下xmake的包机制怎么使用。。
假如你现在的工程已经有了两个包:zlib.pkg,polarssl.pkg(如何构建包,后续会详细说明,现在可以参考TBOX依赖包下已有包的例子),你的工程目录结构如下:
demo
- xmake.lua
- src
main.c
- pkg
zlib.pkg
polarssl.pkg
那么你可以修改xmake.lua来使用上述的两个依赖包: