我做了一个非常简单的程序来打印两个变量的地址.
#includeint main() { int a,b; printf("%u\n%u",&a,&b); return 0; }
但是,Clang-3.7编译器发出警告:
warning:format指定类型'unsigned int'但参数的类型为'int*'[-Wformat]`
但是,当我使用GCC-5.x进行编译时,它没有发出任何警告.哪一项是正确的?
我知道的一件事是做错unsigned int num=&a;
会因为地址只能存储在指针中.但是,编译器在打印地址时发出警告是否正确?
我从gcc.godbolt.org编译了我的程序
%p
是打印地址的正确格式说明符:
printf("%p\n%p",(void*)&a, (void*)&b);
C标准要求对应的参数%p
应该是类型void*
.所以演员都在那里.
C11,参考:
p参数应该是指向void的指针.指针的值以实现定义的方式转换为打印字符序列.
使用不正确的格式说明符是未定义的行为.编译器不需要为未定义的行为生成任何诊断.所以gcc和clang都是正确的.
GCC 5.1确实在我的系统上发出警告而没有任何其他选项.GCC godbolt用更严格的编译器选项产生警告:-Wall -Wextra
.通常,您应该使用最严格的编译器选项进行编译.