對普通函數的檢查
這些宏被用於尋找沒有包括在特定函數測試宏中的函數
如果函數可能出現在除了缺省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
compliant)的頭文件(以及可能的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 (參見檢驗聲
From:http://tw.wingwit.com/Article/program/Oracle/201311/16653.html