Mark D. Baushke wrote:
> > static inline char *
> > xstrcat (size_t argcount, va_list args)
> > {
> >   char *result;
>
> ...elided...
>
> >   /* Allocate and fill the result string.  */
> >   result = (char *) xmalloc (totalsize + 1);
>
> Why is the cast needed? I was under the impression that GNULIB was using
> C89 semantics which should mean that
>
>   result = xmalloc (totalsize + 1);
>
> is all that is needed because 'void *xmalloc (size_t s);' should be the
> prototype and a 'void *' function should not need a cast.

The cast is not needed if
  1. you write ANSI C or ISO C code, and
  2. you are willing to rethink the code in depth each time you modify it.

I use the cast because

  1. I try to write code that is both valid ANSI C and C++ (this helps a lot
     in the Cygwin and mingw ports, due to the brokenness of shared libraries
     on that platform).

  2. When I manipulate code, I often use "correctness preserving 
transformations".
     For example:

        <type> result = <initializer>;
        return <expression>(result);

     where <expression> does not refer to result, can be transformed into

        return <expression>(<initializer>);

     Not so any more if you omit the casts:

        char *result = xmalloc (totalsize + 1);
        return result + 1;

     is valid C code, but

        return xmalloc (totalsize + 1) + 1;

     is not.

     The less you have to think when manipulating some code, the better.

Bruno



Reply via email to