问题:
linux下编写一个普通的打印语句:
1 |
printf("sizeof int is %d", sizeof(int)); |
编译时会得到如下的warning:
1 |
warning: format '%d' expects type 'int', but argument 2 has type 'long unsigned int' |
源码:
1 2 3 4 5 |
#include <stdio.h> int main() { printf("sizeof int=%d\n",sizeof(int)); } |
1 2 3 4 |
root@sin-Vostro-230:/home/sin/src/c# gcc testsizeof.c -o testsizeof testsizeof.c: In function 'main': testsizeof.c:5:5: warning: format '%d' expects argument of type 'int', but argument 2 has type 'long unsigned int' [-Wformat=] printf("sizeof int=%d",sizeof(int)); |
问题原因
这是因为我的系统是64位的,sizeof返回的size_t类型定义为long unsigned int.
1 2 |
root@sin-Vostro-230:/home/sin/src/c# uname -a Linux sin-Vostro-230 3.13.0-24-generic #46-Ubuntu SMP Thu Apr 10 19:11:08 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux |
而对32位系统,不会产生该warning。因为32为的size_t类型是unsigned int.
那如果程序需要在32和64位系统保持兼容性,不希望产生该warning,如何处理呢?
问题解决
1.强制转换size_t为unsigned int. 这种方式可以去掉warning,但有截断,只能是权宜之计。
2.原来printf已经为该兼容性定义了新的格式字符z。
修改源代码:
1 2 3 4 5 |
#include <stdio.h> int main() { printf("sizeof int=%zu\n",sizeof(int)); } |
再编译,32位和64位系统都不会有warning。
1 2 3 |
root@sin-Vostro-230:/home/sin/src/c# gcc testsizeof.c -o testsizeof root@sin-Vostro-230:/home/sin/src/c# ./testsizeof sizeof int=4 |
发表评论
要发表评论,您必须先登录。