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*,...)
?
JavaScript void 0 means returning undefined (void) as a primitive value. You might come across the term “JavaScript:void(0)” while going through HTML documents. It is used to prevent any side effects caused while inserting an expression in a web page.
You can print a pointer value using printf with the %p format specifier. To do so, you should convert the pointer to type void * first using a cast (see below for void * pointers), although on machines that don't have different representations for different pointer types, this may not be necessary.
C11, §6.2.5, ¶28 (draft N1570) says:
A pointer to void shall have the same representation and alignment requirements as a pointer to a character type. 48) Similarly, pointers to qualified or unqualified versions of compatible types shall have the same representation and alignment requirements.
(emphasis mine).
It's specifically allowed to access a void*
argument using va_arg(args, char*)
and vice versa, not just for the null pointer.
See also http://en.cppreference.com/w/cpp/utility/variadic/va_arg
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With