知识大全 autoconf手册(四)
Posted 函数
篇首语:不怕学问浅,就怕志气短。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 autoconf手册(四)相关的知识,希望对你有一定的参考价值。
对普通函数的检查 这些宏被用于寻找没有包括在特定函数测试宏中的函数 如果函数可能出现在除了缺省C库以外的库中 就要首先为这些库调用AC_CHECK_LIB 如果你除了需要检查函数是否存在之外 还要检查函数的行为 你就不得不为此而编写你自己的测试(参见编写测试) 宏 AC_CHECK_FUNC (function [action if found [ action if not found]]) 如果可以使用C函数function 就运行shell命令action if found 否则运行 action if not found 如果你只希望在函数可用的时候定义一个符号 就考虑使用 AC_CHECK_FUNCS 由于C++比C更加标准化 即使在调用了AC_LANG_CPLUSPLUS 的时候 本宏仍然用C的连接方式对函数进行检查 (关于为测试选择语言的详情 请参见 对语言的选择) 宏 AC_CHECK_FUNCS (function [ action if found [ action if not found]]) 对于每个在以空格分隔的函数列表function中出现的函数 如果可用 就定义HAVE_function (全部大写) 如果给出了action if found 它就是在找到一个函数的时候执行的附加的shell代码 你可以给出 `break 以便在找到第一个匹配的时候跳出循环 如果给出了action if not found 它就在找不到某个函数的时候执行 宏 AC_REPLACE_FUNCS (function ) 本宏的功能就类似于以将`function o 添加到输出变量LIBOBJS的shell 代码为参数action if not found 调用AC_CHECK_FUNCS 你可以通过用 `#ifndef HAVE_function 包围你为函数提供的替代版本的原型来声明函数 如果系统含有该函数 它可能在一个你应该引入的头文件中进行声明 所以你不应该重新声明它 以避免声明冲突 头文件 下列宏检查某些C头文件是否存在 如果没有为你需要检查的头文件定义特定的宏 而且你不需要检查它的任何特殊属性 那么你就可以使用一个通用的头文件检查宏 对特定头文件的检查 这些宏检查特定的系统头文件 它们是否存在 以及在某些情况下它们是否定义了特定的符号 宏 AC_DECL_SYS_SIGLIST 如果在系统头文件 `signal h 或者`unistd h 中定义了变量sys_siglist 就定义SYS_SIGLIST_DECLARED 宏 AC_DIR_HEADER 类似于调用AC_HEADER_DIRENT和AC_FUNC_CLOSEDIR_VOID 但为了指明找到了哪个头文件而定义了不同的一组C预处理器宏 本宏和它定义的名字是过时的 它定义的名字是 `dirent h DIRENT `sys/ndir h SYSNDIR `sys/dir h SYSDIR `ndir h NDIR 此外 如果closedir不能返回一个有意义的值 就定义VOID_CLOSEDIR 宏 AC_HEADER_DIRENT 对下列头文件进行检查 并且为第一个找到的头文件定义`DIR 以及列出的C预处理器宏 `dirent h HAVE_DIRENT_H `sys/ndir h HAVE_SYS_NDIR_H `sys/dir h HAVE_SYS_DIR_H `ndir h HAVE_NDIR_H 源代码中的目录库声明应该以类似于下面的方式给出 #if HAVE_DIRENT_H # include # define NAMLEN(dirent) strlen((dirent) >d_name) #else # define dirent direct # define NAMLEN(dirent) (dirent) >d_namlen # if HAVE_SYS_NDIR_H #include # endif # if HAVE_SYS_DIR_H #include # endif # if HAVE_NDIR_H #include # endif #endif 使用上述声明 程序应该把变量定义成类型struct dirent 而不是struct direct 并且应该通过把指向struct direct的指针传递给宏NAMLEN来获得目录项的名称的长度 本宏还为SCO Xenix检查库`dir 和`x 宏 AC_HEADER_MAJOR 如果`sys/types h 没有定义major minor和makedev 但`sys/mkdev h 定义了它们 就定义MAJOR_IN_MKDEV 否则 如果`sys/sysmacros h 定义了它们 就定义MAJOR_IN_SYSMACROS 宏 AC_HEADER_STDC 如果含有标准C(ANSI C)头文件 就定义STDC_HEADERS 特别地 本宏检查`stdlib h `stdarg h `string h 和`float h 如果系统含有这些头文件 它可能也含有其他的标准C头文件 本宏还检查`string h 是否定义了memchr (并据此对其他mem函数做出假定) `stdlib h 是否定义了free(并据此对malloc和其他相关函数做出假定) 以及`ctype h 宏是否按照标准C的要求而可以用于被设置了高位的字符 因为许多含有GCC的系统并不含有标准C头文件 所以用STDC_HEADERS而不是__STDC__ 来决定系统是否含有服从标准(ANSI pliant)的头文件(以及可能的C库函数) 在没有标准C头文件的系统上 变种太多 以至于可能没有简单的方式对你所使用的函数进行定义以使得它们与系统头文件声明的函数完全相同 某些系统包含了ANSI和BSD函数的混合 某些基本上是标准(ANSI)的 但缺少`memmove 有些系统在`string h 或者`strings h 中以宏的方式定义了BSD函数 有些系统除了含有`string h 之外 只含有BSD函数 某些系统在`memory h 中定义内存函数 有些在`string h 中定义 等等 对于一个字符串函数和一个内存函数的检查可能就够了 如果库含有这些函数的标准版 那么它就可能含有其他大部分函数 如果你在`configure in 中安放了如下代码 AC_HEADER_STDC AC_CHECK_FUNCS(strchr memcpy) 那么 在你的代码中 你就可以像下面那样放置声明 #if STDC_HEADERS # include #else # ifndef HAVE_STRCHR #define strchr index #define strrchr rindex # endif char *strchr () *strrchr (); # ifndef HAVE_MEMCPY #define memcpy(d s n) bcopy ((s) (d) (n)) #define memmove(d s n) bcopy ((s) (d) (n)) # endif #endif 如果你使用没有等价的BSD版的函数 诸如memchr memset strtok 或者strspn 那么仅仅使用宏就不够了 你必须为每个函数提供一个实现 以memchr为例 一种仅仅在需要的时候(因为系统C库中的函数可能经过了手工优化)与你的实现协作的简单方式是把实现放入 `memchr c 并且使用`AC_REPLACE_FUNCS(memchr) 宏 AC_HEADER_SYS_WAIT 如果`sys/wait h 存在并且它和POSIX 相兼容 就定义HAVE_SYS_WAIT_H 如果`sys/wait h 不存在 或者如果它使用老式BSD union wait 而不是 int来储存状态值 就可能出现不兼容 如果`sys/wait h 不与POSIX 兼容 那就不是引入该头文件 而是按照它们的常见解释定义POSIX 宏 下面是一个例子 #include #if HAVE_SYS_WAIT_H # include #endif #ifndef WEXITSTATUS # define WEXITSTATUS(stat_val) ((unsigned)(stat_val) >> ) #endif #ifndef WIFEXITED # define WIFEXITED(stat_val) (((stat_val) & ) == ) #endif 宏 AC_MEMORY_H 在`string h 中 如果没有定义memcpy memcmp等函数 并且`memory h 存在 就定义NEED_MEMORY_H 本宏已经过时 可以用AC_CHECK_HEADERS(memory h)来代替 参见为AC_HEADER_STDC提供的例子 宏 AC_UNISTD_H 如果系统含有`unistd h 就定义HAVE_UNISTD_H 本宏已经过时 可以用 `AC_CHECK_HEADERS(unistd h) 来代替 检查系统是否支持POSIX 的方式是 #if HAVE_UNISTD_H # include # include #endif #ifdef _POSIX_VERSION /* Code for POSIX systems */ #endif 在POSIX 系统中包含了`unistd h 的时候定义_POSIX_VERSION 如果系统中没有`unistd h 那么该系统就一定不是POSIX 系统 但是 有些非POSIX (non POSIX )系统也含有`unistd h 宏 AC_USG 如果系统并不含有`strings h rindex bzero等头文件或函数 就定义USG 定义USG就隐含地表明了系统含有`string h strrchr memset等头文件或函数 符号USG已经过时了 作为本宏的替代 参见为AC_HEADER_STDC提供的例子 对普通头文件的检查 这些宏被用于寻找没有包括在特定测试宏中的系统头文件 如果你除了检查头文件是否存在之外还要检查它的内容 你就不得不为此而编写你自己的测试(参见编写测试) 宏 AC_CHECK_HEADER (header file [action if found [ action if not found]]) 如果系统头文件header file存在 就执行shell命令action if found 否则执行action if not found 如果你只需要在可以使用头文件的时候定义一个符号 就考虑使用 AC_CHECK_HEADERS 宏 AC_CHECK_HEADERS (header file [ action if found [ action if not found]]) 对于每个在以空格分隔的参数列表header file出现的头文件 如果存在 就定义 HAVE_header file(全部大写) 如果给出了action if found 它就是在找到一个头文件的时候执行的附加shell代码 你可以把`break 作为它的值以便在第一次匹配的时候跳出循环 如果给出了action if not found 它就在找不到某个头文件的时候被执行 结构 以下的宏检查某些结构或者某些结构成员 为了检查没有在此给出的结构 使用AC_EGREP_CPP (参见检验声 cha138/Article/program/Oracle/201311/16653相关参考