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