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

时间:2016-10-05 11:15:16

标签: c pointers language-lawyer

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

详细信息:

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

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

我想将(char*)0替换为NULL,但要判断 http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf&#39; S:

  

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

     

3一个整数常量表达式,其值为0,或者是这样的   表达式转换为类型void *,称为空指针常量。 66)   如果将空指针常量转换为指针类型,则   结果指针,称为空指针,保证比较   不等于指向任何对象或函数的指针。

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

如果我定义:

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

使用它来终止我的variadic(char*,...)

是否合法

2 个答案:

答案 0 :(得分:35)

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

  

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

(强调我的)。

答案 1 :(得分:10)

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

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