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

C++ 使用autoconf检测过时和不正确的函数原型,c++,string,autoconf,prototype,C++,String,Autoconf,Prototype,我维护一个用autoconf构建的开源程序 现在我的一些用户遇到了问题。他们使用的是来自一个组织的预分发VM,该组织的strchr原型不正确。他们的原型是: char *strchr(char *,int c); 当我们当然知道它应该是: char *strchr(const char *s,int c); (它本身是坏的,因为输出实际上应该是const char*,但是如果传入的是char*,而不是const char*,则无法修改它提供的内容,但我离题了 我的问题:有没有一种方法可以创建

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

现在我的一些用户遇到了问题。他们使用的是来自一个组织的预分发VM,该组织的strchr原型不正确。他们的原型是:

char *strchr(char *,int c);
当我们当然知道它应该是:

char *strchr(const char *s,int c);
(它本身是坏的,因为输出实际上应该是
const char*
,但是如果传入的是
char*
,而不是
const char*
,则无法修改它提供的内容,但我离题了

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

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

谢谢!

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

例如(未经测试):

AC\u TRY\u COMPILE([#include],
[const char*str=“Test”strhr(str,'t');],
一致性\u strchr=是,
一致性(strchr=否)
如果测试“$符合要求”=是,则
定义(具有符合标准的结构,1,
[如果strchr采用常量字符*,则定义为1])
fi

u您在第4行有一位非常亲密的家长。除此之外,它还起了作用。谢谢!
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