void *总是与char *具有相同的表示吗?

void*总是与char*具有相同的表示吗?

细节:

我想使用一个可变参数函数,它使char *被一个(char*)0终止,如下所示:

 int variadic(char*, ...); //<-prototype variadic("foo", "bar", (char*)0); //<- usage 

我想用NULL替换(char*)0 ,但是从http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf来判断:

66)宏NULL在(和其他头部)中定义为空指针常量; 见7.19。

3值为0的整型常量表达式或类型为void *的表达式称为空指针常量。 66)如果将空指针常量转换为指针类型,则保证将结果指针(称为空指针)与指向任何对象或函数的指针进行比较。

我不能,因为在variadic上下文中,我绝对需要一个char*和一个普通的0是不可接受的。

如果我定义:

 #define NIL (void*)0 /*<= never a plain 0*/ 

用它来终止我的variadic(char*,...)对我来说是否合法?

C11,§6.2.5,¶28(草案N1570 )说:

指向void的指针应具有与指向字符类型的指针相同的表示和对齐要求。 48)类似地,指向兼容类型的合格或不合格版本的指针应具有相同的表示和对齐要求。

(强调我的)。

它特别允许使用va_arg(args, char*)访问void*参数va_arg(args, char*)反之亦然,而不仅仅是空指针。

另见http://en.cppreference.com/w/cpp/utility/variadic/va_arg