如何使用autoconf检查POSIX一致性

维尔赫姆·格雷(Vilhelm Gray)

我的项目遵循POSIX.1-2008标准,并且我想确保用户的实现符合该标准。

到目前为止,我一直在使用POSIX标准中指定AC_DEFINE_POSIX_C_SOURCE宏。

AC_DEFINE([_POSIX_C_SOURCE], [200809L], [Define the POSIX version])

但是,由于这是一个简单的C预处理程序#define宏,因此它无法阻止兼容POSIX的实现的编译。

Autoconf是否提供标准宏来检查实现是否符合特定的POSIX标准?

维尔赫姆·格雷(Vilhelm Gray)

为了方便地检查用户的实现是否符合特定的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做出的一些保证而起作用的。


步骤1

我们首先设置_POSIX_C_SOURCE200809L

#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


第2步

因此,当我们包括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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章