📄 c&c++ young library +
字号:
这一篇将介绍如何将程序库移植到不同的平台和编译器上。程序库是用标准C和C++来
编写的,理论上是不应该存在移植的问题的,但是由于各个编译器厂家对标准C和C++(尤
其是C++)支持的程度大不相同,所以了解如何移植是很有必要的。以下内容适用于0.8.4
以上的版本。
**2.1**
youngc程序库的移植。
*2.1.1*
要使youngc程序库能顺利编译,编译器至少要满足:
1、支持标准的函数指针;
2、支持除法运算。
我在使用KEIL C51编译的时候,就是由于编译器无法很好的支持函数指针以及不支持
除法运算,导致编译失败。
*2.1.2*
ylib-$(VERSION)/young/youngc.h 包含有 youngc 库中所有的头文件,直接包含该文
件会简单很多($(VERSION)表示版本号,下同)。下面列出 youngc 子库中各个文件的功能
及其依赖关系:
-------------------------------------------------------------------------------
文件名 功能 包含文件
-------------------------------------------------------------------------------
yc_configuration.h youngc程序库条件编译宏设置文件 无
yc_definition.h youngc程序库常量、宏、类型定义文件 stddef.h
limits.h
yc_configuration.h
yc_memory.h 存储函数声明 yc_definition.h
yc_memory.c 存储函数实现 stdio.h
stdlib.h
yc_memory.h
yc_memalgo.h memory类型通用算法声明 yc_definition.h
yc_memalgo.c memory类型通用算法实现 yc_memalgo.h
yc_rscalgo.h resource类型通用算法声明 yc_definition.h
yc_rscalgo.c resource类型通用算法实现 yc_memalgo.h
yc_rscalgo.h
yc_dymemarr.h 动态memory类型数组的声明 yc_definition.h
yc_dymemarr.c 动态memory类型数组的实现 yc_memalgo.h
yc_dymemarr.h
yc_dyrscarr.h 动态resource类型数组的声明 yc_definition.h
yc_dyrscarr.c 动态resource类型数组的实现 yc_memalgo.h
yc_rscalgo.h
yc_dyrscarr.h
yc_dblnklst.h 双向循环链表的声明 yc_definition.h
yc_dblnklst.c 双向循环链表的实现 yc_memalgo.h
yc_dblnklst.h
yc_sglnklst.h 单向链表的声明 yc_definition.h
yc_sglnklst.c 单向链表的实现 yc_memalgo.h
yc_sglnklst.h
yc_chkarray.h 数据块阵列的声明 yc_definition.h
yc_chkarray.c 数据块阵列的实现 yc_memalgo.h
yc_chkarray.h
yc_bbstree.h 平衡二叉查找树的声明 yc_definition.h
yc_bbstree.c 平衡二叉查找树的实现 yc_memalgo.h
yc_bbstree.h
yc_hashtable.h 散列表的声明 yc_definition.h
yc_hashtable.c 散列表的实现 yc_memalgo.h
yc_hashtable.h
yc_string.h 动态字符串的声明 stdio.h
yc_definition.h
yc_dymemarr.h
yc_string.c 动态字符串的实现 wchar.h(支持宽字符串时需要)
wctype.h(支持宽字符串时需要)
ctype.h
float.h
string.h
stdarg.h
yc_memory.h
yc_memalgo.h
yc_string.h
yc_function.h 辅助函数的声明 yc_definition.h
yc_function.c 辅助函数的实现 limits.h
math.h
float.h
string.h
yc_function.h
yc_algorithm.h 通用算法的声明 yc_memalgo.h
yc_rscalgo.h
yc_algorithm.c 通用算法的实现 yc_algorithm.h
-------------------------------------------------------------------------------
*2.1.3*
youngc子库的移植主要由yc_configuration.h中定义的条件编译宏来完成控制,定义的宏及其
含义如下:
1、__MACRO_C_YOUNG_LIBRARY_COMPILER_SUPPORT_STANDARD_MEMORY_FUNCTION__
若编译器附带的标准库支持memcpy、memmove、memset函数则定义该宏。该宏主要用于
控制yc_memalgo.h中的ylib_memcopy、ylib_memmove、ylib_memset函数,如果该宏定义,
则这三个函数被定义为宏,分别调用memcpy、memmove、memset函数;如果使用者想使用自
己实现的效率更高的相应功能的函数,则可以禁止定义该宏,并在yc_memalgo.c中分别实现
ylib_memcopy、ylib_memmove、ylib_memset函数。
2、__MACRO_C_YOUNG_LIBRARY_COMPILER_SUPPORT_IO_SYSTEM__
若编译器支持C语言标准库的IO系统,则定义该宏。该宏主要用于控制yc_string.h、
yc_string.c中的动态字符串与IO的交互。
3、__MACRO_C_YOUNG_LIBRARY_COMPILER_SUPPORT_FILE_SYSTEM__
若编译器支持C语言标准库的文件系统,则定义该宏。该宏主要用于控制yc_string.h、
yc_string.c中的动态字符串与文件的交互。
4、__MACRO_C_YOUNG_LIBRARY_COMPILER_SUPPORT_C95_WIDE_CHARACTER__
若编译器及附带的标准库支持ISO C95标准定义的宽字符功能,则定义该宏。该宏主要
用于控制yc_string.h、yc_string.c中的动态宽字符串的声明与实现。
5、__MACRO_C_YOUNG_LIBRARY_COMPILER_SUPPORT_BOOLEAN_TYPE__
若编译器支持bool类型,则定义该宏。如果编译器支持ISO C99标准,或者使用C++编
译器编译,或者编译器扩展了对该功能的支持,均可以在yc_configuration.h中定义该宏。
6、__MACRO_C_YOUNG_LIBRARY_COMPILER_SUPPORT_INLINE_FUNCTION__
若编译器支持内联函数,则定义该宏。如果编译器支持ISO C99标准,或者使用C++编
译器编译,或者编译器扩展了对该功能的支持,均可以在yc_configuration.h中定义该宏。
7、__MACRO_C_YOUNG_LIBRARY_COMPILER_SUPPORT_LONG_LONG_TYPE__
若编译器支持long long类型,则定义该宏。在ISO C99中,long long被定义为不小于
64位的整数,如果编译器支持ISO C99标准,或者编译器扩展了对该功能的支持,均可以在
yc_configuration.h中定义该宏。
8、__MACRO_C_YOUNG_LIBRARY_COMPILER_SUPPORT_VARIABLE_LENGTH_ARRAY__
若编译器支持变长数组,则定义该宏。如果编译器支持ISO C99标准,或者编译器扩展
了对该功能的支持,均可以在yc_configuration.h中定义该宏。
*2.1.4*
使用建议:
如果需要在工程中使用youngc程序库,可以将youngc目录下的文件全部加入工程进行
编译,也可以只将需要用到的文件加入工程进行编译,但是需要注意文件之间的依赖关系,
可以参看2.1.2列出的程序库文件表。
在Linux、Unix下,可以将程序库编译成静态库或共享库;在Windows下,可以将程序
库编译成动态链接库,只是需要修改头文件中函数的声明和.c文件中相应函数的声明。
如果在无操作系统支持的嵌入式系统上使用的话,建议yc_memory.*不要使用。如果
硬件平台不支持浮点数的话,则散列表无法使用。如果编译器附带的标准库对float.h不
能完全支持的话,则yc_function.c可能会无法通过编译。
需要注意的是对动态字符串的使用,从上面的文件依赖关系可以看到yc_string.*对
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -