On Sun, 4 Feb 2001, Greg Stein wrote: > There was some discussion about iconv prototyes here recently, but I kind of > missed it. > > Do we always need to live with a warning about a type mismatch, or is the > cast below appropriate? > > IOW, do some headers have "const" on them, and others not?
Yup, you cannot just use a cast, you need to use a HAVE... test because headers differ and newer versions of gcc will generate an error on a plain cast. Here is the bit of code from the Jikes java compiler that deals with this issue. size_t n = iconv(_converter, #ifdef HAVE_ERROR_CALL_ICONV_CONST (char **) #endif &source_ptr, &srcl, (char **)&chp, &chl ); And here is the autoconf macro that checks for the error that will require a cast. dnl @synopsis AC_CHECK_ICONV dnl dnl Check to see if the iconv functions and libs are present dnl @version $Id: ac_check_iconv.m4,v 1.1 2000/10/10 07:06:50 mdejong Exp $ dnl @author Mo DeJong <[EMAIL PROTECTED]> dnl AC_DEFUN(AC_CHECK_ICONV, [ dnl Check for the iconv header file AC_CHECK_HEADERS(iconv.h) dnl Check if iconv library is present AC_CHECK_LIB(iconv, iconv) iconv_includes=" #ifdef HAVE_STRING_H # if !STDC_HEADERS && HAVE_MEMORY_H # include <memory.h> # endif # include <string.h> #else # ifdef HAVE_STRINGS_H # include <strings.h> # endif #endif #ifdef HAVE_WCHAR_H # include <wchar.h> #endif #ifdef HAVE_ICONV_H # include <iconv.h> #endif " dnl Make sure we can compile a simple call to iconv AC_CACHE_CHECK(simple call to iconv, ac_cv_call_iconv, [ AC_TRY_COMPILE($iconv_includes, [iconv(0, NULL, NULL, NULL, NULL)], ac_cv_call_iconv=yes, ac_cv_call_iconv=no) ]) dnl No additional testing is possible if regular call does not work. dnl In this case, we just assume iconv can not be used by the application if test "$ac_cv_call_iconv" = "yes" ; then dnl Check for declaration of iconv without const qualifier in 2nd argument AC_CACHE_CHECK(for error calling iconv with const 2nd argument, ac_cv_error_call_iconv_const, [AC_TRY_COMPILE($iconv_includes, [ const char ** s = NULL; iconv(0, s, NULL, NULL, NULL); ], ac_cv_error_call_iconv_const=no, ac_cv_error_call_iconv_const=yes) ]) if test "$ac_cv_error_call_iconv_const" = "yes"; then dnl define symbol so we know when to cast the argument to iconv dnl from const char ** to char * AC_DEFINE(HAVE_ERROR_CALL_ICONV_CONST, , [Defined when the compiler would generate an error on a call to iconv with a non const 2nd argument. This is a known problem on IRIX systems.]) dnl Double check that our suggested fix works. AC_CACHE_CHECK(fix for calling iconv with non const argument, ac_cv_call_iconv_non_const, [AC_TRY_COMPILE($iconv_includes, [ const wchar_t * s = NULL; iconv( 0, #ifdef HAVE_ERROR_CALL_ICONV_CONST (char **) #endif s, NULL, NULL, NULL); ], ac_cv_call_iconv_non_const=yes, AC_MSG_ERROR([Could not compile with iconv const cast fix]) )]) fi fi ] ) cheers Mo DeJong Red Hat Inc