C 结构群集的自动确认检查

C 结构群集的自动确认检查,c,linux,unix,autotools,autoconf,C,Linux,Unix,Autotools,Autoconf,fcntl()使用struct flock结构来定义和检查文件锁。不幸的是,在不同的Unix系统上,此结构中的字段顺序不同。有人知道如何使用autoconf检查它,或者至少检查结构是否为特定格式(例如,问题是-结构格式是否与Linux格式匹配) 您可以使用此autoconf宏来查找struct flock的某个成员是否存在: AC_CHECK_MEMBERS([struct flock.l_type],[],[],[[#include <fcntl.h>]]) 您也可以在运行时在程

fcntl()
使用
struct flock
结构来定义和检查文件锁。不幸的是,在不同的Unix系统上,此结构中的字段顺序不同。有人知道如何使用autoconf检查它,或者至少检查结构是否为特定格式(例如,问题是-结构格式是否与Linux格式匹配)

您可以使用此autoconf宏来查找
struct flock
的某个成员是否存在:

AC_CHECK_MEMBERS([struct flock.l_type],[],[],[[#include <fcntl.h>]])

您也可以在运行时在程序中执行此检查,它不必是配置步骤。

问题在于,例如,Linux和*BSD都有l_类型,但在结构中的不同位置。我需要弄清楚我有哪一个。例如,在linux上,l_类型是第一位的,在*BSD上是第四位的。随着更新,我喜欢这种方法,我会尝试一下,看看它是否有效。作为一种替代方法,您可以使用
offsetof
工具在结构中查找
l_类型
的偏移量。
AC_MSG_CHECKING("whether flock struct is linux ordered or not")
AC_TRY_RUN([
  #include <fcntl.h>
  struct flock lock = { 1, 2, 3, 4, 5 };
  int main() { return lock.l_type==1 ? 0 : 1; }
], [
    AC_DEFINE(HAVE_FLOCK_LINUX) 
    AC_MSG_RESULT("yes")
], AC_MSG_RESULT("no") )