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*,...)
答案 0 :(得分:35)
C11,§6.2.5,¶28(草案N1570)说:
指向void的指针应具有相同的表示和对齐方式 要求作为指向字符类型的指针。 48)同样,指针 对兼容类型的合格或不合格版本应具有 相同的表示和对齐要求。
(强调我的)。
答案 1 :(得分:10)
特别允许使用void*
访问va_arg(args, char*)
参数,反之亦然,而不仅仅是空指针。