From: "Josh Wilmes" <[EMAIL PROTECTED]>
>
> Good stuff!  However, regarding the function pointer thing, i've got
compilers
> (tcc and lcc) which disagree with you.
>
> Using NULL where a function pointer is expected is considered an error by
> tcc, and a mandatory warning by lcc.  It is my understanding that
conversion
> between data pointers and function pointers is forbidden under ANSI C89.
I've
> sent in several patches which jump through some fairly painful hoops
because of
> this.  It seems rather necessary though, as we are committed to building
> as ANSIly as possible.
>
> Here are a page on the matter i found on google.  I know i had some
> others, but I can't find them at the moment.
>
>    http://www.devx.com/free/tips/tipview.asp?content_id=114
Interestingly enough that takes me to a page about VB and RDBMS. Guess they
moved it.
Given the age of these compilers, I'm sure they aim toward C90 conformance,
and the
only copy of a standard that I have is C99, but I managed to find this with
google:
http://groups.google.com/groups?selm=clcm-19971221-0004%40plethora.net&outpu
t=gplain

The relevant excerpt:
    Using NULL in this way is perfectly conforming, as it is
    expressly allowed by the standard in 6.2.2.3:

    ===================
       An integral constant expression with the value 0, or such an
    expression cast to type void *, is called a null pointer
    constant.  If a null pointer constant is assigned to or compared
    for equality to a pointer, the constant is converted to a
    pointer of that type.  Such a pointer, called a null pointer, is
    guaranteed to compare unequal to a pointer to any object or
    function.

       Two null pointers, converted through possibly different
    sequences of casts to pointer types, shall compare equal.
    ====================
Still, if tcc won't take it, there's no sense in whining about it. This
should fix it:

###############################
diff -ur include/parrot/parrot.h include/myparrot/parrot.h
--- include/parrot/parrot.h Fri Feb 22 18:03:58 2002
+++ include/myparrot/parrot.h Sat Feb 23 03:03:50 2002
@@ -76,9 +76,11 @@
 /* define some shortcuts for dealing with function pointers */
 /* according to ANSI C, casting between function and non-function pointers
is
  * no good, except in the special case of NULL.  So we should use
"funcptr_t"
- * in place of void* when dealing with function pointers*/
+ * in place of void* when dealing with function pointers. Also, some
compilers
+ * do the wrong thing when assigning NULL to a function pointer, so we have
to
+ * use NULLfunc instead*/
 typedef void (*funcptr_t)(void);
-#define NULLfunc NULL
+#define NULLfunc (funcptr_t)0

 /* Provide support for inline keyword where available.  Just make sure to
use
  * "INLINE" instead and it will DTRT. */



Reply via email to