世界
我现在将一些32位C代码移植到64位平台。
对于下面的代码,我认为当我添加选项
"-Wall -Wconversion -Wextra"
以将代码编译为64位平台(x86_64而不是IA64)时,GCC应该会发出警告。
但是,我没有收到任何警告......
int len = strlen(pstr);
奇怪的是,当我将代码更改为以下内容时,我可以获得关于“size_t”和“int”之间转换的问题
size_t sz = strlen(pstr);
int len = sz;
环境信息:
gcc版本4.4.7
Linux dev217 2.6.32-358.el6.x86_64#1 SMP Fri 2月22日00:31:26 UTC 2013 x86_64 x86_64 x86_64 GNU / Linux
任何想法为什么?
编辑: 我可以通过一个非常简单的程序验证这一点。
[jsun @ / TMP]
[jsun @ / tmp] cat test1.c
#include <stdio.h>
#include <string.h>
#include <unistd.h>
int main()
{
int len = strlen("testllllll");
printf("len is %d\n", len);
return 0;
}
[jsun @ / tmp] gcc -Wall -Wconversion -Wextra test1.c
[jsun @ / TMP]
稍微修改一下代码后:
[jsun @ / TMP]
[jsun @ / tmp] cat test1.c
#include <stdio.h>
#include <string.h>
#include <unistd.h>
int main()
{
size_t sz = strlen("test111111");
int len = sz;;
printf("len is %d\n", len);
return 0;
}
[jsun @ / tmp] gcc -Wall -Wconversion -Wextra test1.c
test1.c:在函数“main”中:
test1.c:8:警告:从“theize_t”转换为“int”可能会改变其值
[jsun @ / TMP]
答案 0 :(得分:3)
gcc优化了strlen()函数,因为它在const字符串上运行(结果在编译时已知)。它可能会用const数替换结果,因此这里不会进行强制转换。
更新:参考 的 http://gcc.gnu.org/onlinedocs/gcc-4.4.7/gcc/Other-Builtins.html 强>
所以strlen和许多其他函数都是内置函数,除非指定了-fno-builtin(或者为单个函数指定了-fno-builtin-function)。 你可以添加-fno-builtin-strlen到你的gcc选项。如果有铸造,它应该警告施法。 或者您可以尝试使用带有strlen()的变量。 gcc不会优化