代码之家  ›  专栏  ›  技术社区  ›  vy32

用autoconf检测过时和不正确的函数原型

  •  3
  • vy32  · 技术社区  · 14 年前

    我维护了一个用autoconf构建的开源程序。

    现在我的一些用户有问题。他们使用的是来自一个组织的预分发虚拟机,该组织中strchr的原型不正确。他们的原型是:

    char *strchr(char *,int c);
    

    当然,当我们知道应该是:

    char *strchr(const char *s,int c);
    

    (它本身是坏的,因为输出应该是 const char * ,但如果传入 char * 而不是一个 常量字符* 但我离题了。

    我的问题是:有没有一种方法可以创建一个autoconf宏来确定使用的原型并相应地使用它?我不想让我的代码说:

    v = strchr((char *)s,c);
    

    谢谢!

    1 回复  |  直到 14 年前
        1
  •  4
  •   Mark B    14 年前

    您应该能够设置一个配置测试,尝试调用 const char* 版本(不使用文本,因为存在到的隐式转换 char* )配置将告诉您它是否编译,因此您可以 #define 基于此,并使用它在代码中做出决定(最好是在某种包装器/实用程序类中)。

    例如(未测试):

    AC_TRY_COMPILE([#include <cstring>],
     [const char* str = "Test"; strchr(str, 't');],
     conforming_strchr=yes,
     conforming_strchr=no)
    if test "$conforming_strchr" = yes; then
      AC_DEFINE(HAVE_CONFORMING_STRCHR, 1,
       [define to 1 if strchr takes const char*])
    fi