[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: how to test for a prototype difference
From: |
Philip Herron |
Subject: |
Re: how to test for a prototype difference |
Date: |
Thu, 1 May 2014 09:40:03 +0100 |
Awh cool thanks for sharing that i couldn't figure out how to do this
with something in work.
On 1 May 2014 01:51, Eric Blake <address@hidden> wrote:
> On 04/30/2014 06:12 PM, Thomas Klausner wrote:
>> Hi!
>>
>> I found out that the prototypes for backtrace() and backtrace_symbol()
>> differ on some operating systems.
>>
>
>>
>> The main difference is that on NetBSD, size_t is used for most
>> arguments that are int on the other systems; also,
>> backtrace_symbols_fd returns an int.
>>
>> I'd like to test for the difference int <-> size_t in a configure
>> script so I can get integer type/sign conversion-warnings free code on
>> all these operating systems.
>>
>> I'm however not sure how to do this. Does anyone have a suggestion?
>
> Yep - use function pointer assignment or redeclaration to force the
> compiler to complain if the redeclaration used the wrong type. Gnulib
> has some examples; here's one with ioctl(), which on Linux takes an
> 'unsigned long' instead of the POSIX 'int' for the second parameter:
>
> AC_CACHE_CHECK([for ioctl with POSIX signature],
> [gl_cv_func_ioctl_posix_signature],
> [AC_COMPILE_IFELSE(
> [AC_LANG_PROGRAM(
> [[#include <sys/ioctl.h>]],
> [[extern
> #ifdef __cplusplus
> "C"
> #endif
> int ioctl (int, int, ...);
> ]])
> ],
> [gl_cv_func_ioctl_posix_signature=yes],
> [gl_cv_func_ioctl_posix_signature=no])
> ])
> if test $gl_cv_func_ioctl_posix_signature != yes; then
> REPLACE_IOCTL=1
> fi
>
> Or this one originally from gettext (but annoyingly encroaching on
> automake's namespace), checking whether iconv() uses a const or not:
>
> AC_MSG_CHECKING([for iconv declaration])
> AC_CACHE_VAL([am_cv_proto_iconv], [
> AC_COMPILE_IFELSE(
> [AC_LANG_PROGRAM(
> [[
> #include <stdlib.h>
> #include <iconv.h>
> extern
> #ifdef __cplusplus
> "C"
> #endif
> #if defined(__STDC__) || defined(_MSC_VER) || defined(__cplusplus)
> size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char *
> *outbuf, size_t *outbytesleft);
> #else
> size_t iconv();
> #endif
> ]],
> [[]])],
> [am_cv_proto_iconv_arg1=""],
> [am_cv_proto_iconv_arg1="const"])
> am_cv_proto_iconv="extern size_t iconv (iconv_t cd,
> $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char *
> *outbuf, size_t *outbytesleft);"])
> am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e
> 's/( /(/'`
> AC_MSG_RESULT([
> $am_cv_proto_iconv])
> AC_DEFINE_UNQUOTED([ICONV_CONST], [$am_cv_proto_iconv_arg1],
> [Define as const if the declaration of iconv() needs const.])
>
> Hopefully that gives you some ideas.
>
> --
> Eric Blake eblake redhat com +1-919-301-3266
> Libvirt virtualization library http://libvirt.org
>
>
> _______________________________________________
> Autoconf mailing list
> address@hidden
> https://lists.gnu.org/mailman/listinfo/autoconf
>
- Re: how to test for a prototype difference,
Philip Herron <=