类型strlen
返回是size_t
,即long unsigned int
.
为什么编译以下代码不会发出关于签名的警告slen
?
char msg[] = "Hello";
int slen= strlen(msg);
Run Code Online (Sandbox Code Playgroud)
(我希望long unsigned int slen
有必要避免这样的警告.)
C和C++语言允许您在没有警告的情况下复制所有不同类型之间的整数(编译器默认情况下会给您一个警告,有些人会这样做char
,这是一个臭名昭着的例外).
有了gcc
你可以使用这个警告,以避免失去的高位(所以long long
到int
会给你在32位机器的警告).
gcc ... -Wstrict-overflow ...
Run Code Online (Sandbox Code Playgroud)
还有一个标志可以防止自动转换:
gcc ... -Wno-int-conversion ...
Run Code Online (Sandbox Code Playgroud)
这可能会导致很多编译问题,但测试代码(一种lint类型的东西)可能是一个好主意.
查看本gcc
手册将为您提供有关这些警告的其他详细信息.
请注意,您还可以使用该-Werror
标志将警告转换为错误.这样编译失败了,而不是让你继续你认为是一个bug的东西.