autoconf
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Problem (with solution) in AC_CHECK_FUNCS


From: Roberto Bagnara
Subject: Problem (with solution) in AC_CHECK_FUNCS
Date: Tue, 05 Nov 2002 10:47:07 +0100
User-agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.1) Gecko/20020827

Suppose we have something like

AC_CHECK_FUNCS([setitimer], [], AC_MSG_ERROR([...]))

then autoconf (version 2.54c and previous ones) tries to compile a
program containing (inessential lines snipped)

#ifdef __cplusplus
extern "C"
#endif
/* We use char because int might match the return type of a gcc2
   builtin and then its argument prototype would still apply.  */
char setitimer ();
char (*f) ();

int
main ()
{
/* The GNU C library defines this for functions which it implements
    to always fail with ENOSYS.  Some functions are actually named
    something starting with __ and the normal name is an alias.  */
#if defined (__stub_setitimer) || defined (__stub___setitimer)
choke me
#else
f = setitimer;
#endif

The problem is with the assignment `f = setitimer;' in case we are
using a standard conforming (strictly speaking) C++ compiler.  In
fact, in standard C++, a value of type "char (*)() C" (a C function)
cannot be assigned to an entity of type "char (*)()" (a C++ function).

The fix is easy: it suffices to change autoconf so that, instead
of generating

------------------------------------------------------------------
#ifdef __cplusplus
extern "C"
#endif
/* We use char because int might match the return type of a gcc2
   builtin and then its argument prototype would still apply.  */
char setitimer ();
char (*f) ();
------------------------------------------------------------------

it produces

------------------------------------------------------------------
#ifdef __cplusplus
extern "C" {
#endif
/* We use char because int might match the return type of a gcc2
   builtin and then its argument prototype would still apply.  */
char setitimer ();
char (*f) ();
#ifdef __cplusplus
}
#endif
------------------------------------------------------------------

so that, in C++, both `f' and `setitimer' have C linkage.
All the best

    Roberto

--
Prof. Roberto Bagnara
Computer Science Group
Department of Mathematics, University of Parma, Italy
http://www.cs.unipr.it/~bagnara/
mailto:address@hidden





reply via email to

[Prev in Thread] Current Thread [Next in Thread]