【发布时间】:2018-12-16 20:15:35
【问题描述】:
我在 Stack Overflow 中阅读了很多关于 C 语言中 %p 格式说明符用法的答案,但似乎没有人解释为什么除了 @ 之外的所有类型都需要显式转换为 void* 987654325@.
我当然知道这样一个事实,即转换到void* 或从void* 转换的要求与可变参数函数的使用有关(请参阅此answer 的第一条评论),而在其他情况下则不是强制性的。
这是一个例子:
int i;
printf ("%p", &i);
产生关于类型不兼容的警告,&i 应转换为 void*(根据标准要求,请再次参阅 here)。
而这段代码编译顺利,没有任何关于类型转换的抱怨:
char * m = "Hello";
printf ("%p", m);
char* 是如何从这个命令中“解脱”出来的?
PS:可能值得补充的是,我在 x86_64 架构上工作,因为指针类型大小取决于它,并且使用 gcc 作为 linux 上的编译器,带有 -W -Wall -std=c11 -pedantic 编译选项。
【问题讨论】:
-
您可以使用
clang 5.*进行检查,如果您将char *与%p放在一起,则会显示警告:warning: format specifies type 'void *' but the argument has type 'char *'。 -
@PaulAnkman 你完全正确!刚刚试了一下,并给出了关于
void*和char*之间类型不兼容的经典讨厌警告。你怎么解释?正如其他答案所指出的,clang是否没有实现关于相同表示/相同对齐类型的可互换性的 c 标准规范?
标签: c types casting printf void-pointers