обнаруживать устаревшие и неправильные прототипы функций с помощью autoconf - PullRequest
3 голосов
/ 28 октября 2010

Я поддерживаю программу с открытым исходным кодом, которая собирается с помощью autoconf.

Сейчас у меня проблема с некоторыми моими пользователями. Они используют предварительно распределенную виртуальную машину из организации, в которой есть неправильный прототип strchr. Их прототип:

char *strchr(char *,int c);

когда, конечно, мы знаем, что это должно быть:

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

(который сам по себе не работает, так как вывод должен быть действительно const char *, но тогда вы не сможете изменить то, что он дает вам, если вы передадите char *, а не const char *, но я отступлю. 1012 *

Мой вопрос: есть ли способ создать макрос autoconf, который определяет, какой прототип используется, и использует его соответствующим образом? Я бы не хотел, чтобы мой код говорил:

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

Спасибо!

1 Ответ

4 голосов
/ 28 октября 2010

Вы должны иметь возможность настроить тест конфигурации, который пытается вызвать версию const char* (НЕ используя литерал, поскольку существует неявное преобразование в char*). Configure сообщит вам, скомпилирован он или нет, поэтому вы можете #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
...