当前位置:  开发笔记 > 编程语言 > 正文

编译器在打印变量的地址时发出警告

如何解决《编译器在打印变量的地址时发出警告》经验,为你挑选了1个好方法。

我做了一个非常简单的程序来打印两个变量的地址.

#include

int 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编译了我的程序



1> P.P...:

%p 是打印地址的正确格式说明符:

printf("%p\n%p",(void*)&a, (void*)&b);

C标准要求对应的参数%p应该是类型void*.所以演员都在那里.

C11,参考:

p参数应该是指向void的指针.指针的值以实现定义的方式转换为打印字符序列.

使用不正确的格式说明符是未定义的行为.编译器不需要为未定义的行为生成任何诊断.所以gcc和clang都是正确的.

GCC 5.1确实在我的系统上发出警告而没有任何其他选项.GCC godbolt用更严格的编译器选项产生警告:-Wall -Wextra.通常,您应该使用最严格的编译器选项进行编译.

推荐阅读
携手相约幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有