我的项目遵循POSIX.1-2008标准,并且我想确保用户的实现符合该标准。
到目前为止,我一直在使用POSIX标准中指定AC_DEFINE
的_POSIX_C_SOURCE
宏。
AC_DEFINE([_POSIX_C_SOURCE], [200809L], [Define the POSIX version])
但是,由于这是一个简单的C预处理程序#define
宏,因此它无法阻止不兼容POSIX的实现的编译。
Autoconf是否提供标准宏来检查实现是否符合特定的POSIX标准?
为了方便地检查用户的实现是否符合特定的POSIX标准,请使用AC_EGREP_CPP
检查以下项的存在和值_POSIX_VERSION
:
AC_EGREP_CPP(posix_200809L_supported,
[#define _POSIX_C_SOURCE 200809L
#include <unistd.h>
#ifdef _POSIX_VERSION
#if _POSIX_VERSION == 200809L
posix_200809L_supported
#endif
#endif
],
[],
[AC_MSG_FAILURE([*** Implementation must conform to the POSIX.1-2008 standard.])]
)
这是由于POSIX做出的一些保证而起作用的。
我们首先设置_POSIX_C_SOURCE
为200809L
。
#define _POSIX_C_SOURCE 200809L
POSIX.1-2008指出,当应用程序包含POSIX.1-2008描述的标头时,并且当此功能测试宏(_POSIX_C_SOURCE
)被定义为具有值时200809L
,则all symbols required by POSIX.1-2008 to appear when the header is included shall be made visible
。
因此,当我们包括unistd.h
在下一行时,将显示POSIX.1-2008要求出现的所有符号。unistd.h
#include <unistd.h>
由于_POSIX_VERSION
必须在中显示unistd.h
,因此现在也可见。
_POSIX_VERSION
由所需POSIX.1-2008标准被设定为一个值200809L
。
对于符合POSIX.1-2008的实现,该值应为200809L。
因此,我们现在要做的就是测试是否_POSIX_VERSION
已定义,如果已定义,则将其设置为等于的值200809L
。
#ifdef _POSIX_VERSION
#if _POSIX_VERSION == 200809L
检查是否_POSIX_VERSION
已定义有助于我们确定实现上是否支持任何POSIX标准。检查的值_POSIX_VERSION
有助于我们缩小是否支持特定版本的POSIX标准。
如果这两个条件都成立,则该实现几乎可以肯定支持POSIX.1-2008。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句