¿Un vacío*siempre tendrá la misma representación que un char*?
pointers language-lawyer (2)
¿Un void*
siempre tendrá la misma representación que un char*
?
Detalles:
Quiero trabajar con una función variadica que toma char * ''s terminado por a (char*)0
como tal:
int variadic(char*, ...); //<-prototype
variadic("foo", "bar", (char*)0); //<- usage
Quería reemplazar (char*)0
con NULL
, pero a juzgar por http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf ''s:
66) La macro NULL se define en (y otros encabezados) como una constante de puntero nulo; ver 7.19.
3 Una expresión constante entera con el valor 0, o una expresión de este tipo para escribir void *, se llama constante de puntero nulo. 66) Si una constante de puntero nulo se convierte en un tipo de puntero, se garantiza que el puntero resultante, llamado puntero nulo, se compare desigual a un puntero a cualquier objeto o función.
No puedo, porque en el contexto variadic
, absolutamente necesito un char*
y un 0
simple es inaceptable.
Si yo definí:
#define NIL (void*)0 /*<= never a plain 0*/
¿Sería legal para mí usarlo para terminar mi variadic(char*,...)
?
C11, §6.2.5, ¶28 (borrador http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf ) dice:
Un puntero a vacío tendrá los mismos requisitos de representación y alineación que un puntero a un tipo de carácter. 48) Del mismo modo, los punteros a las versiones cuali fi cadas o no calificadas de tipos compatibles deberán tener los mismos requisitos de representación y alineación.
(énfasis mío).
Está específicamente permitido acceder a un argumento void*
usando va_arg(args, char*)
y viceversa, no solo para el puntero nulo.
Ver también http://en.cppreference.com/w/cpp/utility/variadic/va_arg