Will a void*
always have the same representation as a char*
?
Details:
I want to work with a variadic function that takes char*'s terminated by a (char*)0
like so:
int variadic(char*, ...); //<-prototype
variadic("foo", "bar", (char*)0); //<- usage
I wanted to replace (char*)0
with NULL
, but judging from
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf's:
66) The macro NULL is defined in (and other headers) as a null pointer constant; see 7.19.
3 An integer constant expression with the value 0, or such an expression cast to type void *, is called a null pointer constant. 66) If a null pointer constant is converted to a pointer type, the resulting pointer, called a null pointer, is guaranteed to compare unequal to a pointer to any object or function.
I can't, because in the variadic
context, I absolutely need a char*
and a plain 0
is unacceptable.
If I defined:
#define NIL (void*)0 /*<= never a plain 0*/
would it be legal for me to use it to terminate my variadic(char*,...)
?
void*
is always implicitly convertible to any other (data) pointer type, that's a given by theC
standard. – StoryTeller - Unslander MonicaNULL
macro is defined in your implementation? It typically is((void *)0)
. But if you pass0
to a variadic function, it will be passed asint
, which is not what you want. So you have to cast it anyway. – too honest for this siteNULL
/0
stuff is broken by design since early versions of C. I always wonder why then did not follow the Pascal (Algol?)-Trail and provided that as special keyword. – too honest for this site