为什么在将intlen的输出存储在int中时没有发出警告?

时间:2017-10-12 21:42:15

标签: c unsigned signed

strlen类型返回size_t,即long unsigned int

为什么编译以下代码不会发出有关slen

签名的警告
char msg[] = "Hello";
int slen= strlen(msg);

(我希望long unsigned int slen是必要的,以避免这种警告。)

1 个答案:

答案 0 :(得分:6)

使用C和C ++语言可以在没有警告的情况下复制所有不同类型之间的整数(编译器默认情况下会给你一个警告,有些会使用char,这是一个臭名昭着的例外)。

使用gcc,您可以使用此警告以避免丢失高位(因此long longint会在32位计算机上发出警告)。

gcc ... -Wstrict-overflow ...

还有一个标志可以阻止自动转换:

gcc ... -Wno-int-conversion ...

这可能会导致很多编译问题,但测试代码( lint 类型的东西)是个好主意。

查看gcc手册将为您提供有关这些警告的其他详细信息。

请注意,您还可以使用-Werror标志将警告转换为错误。这样编译失败了,而不是让你继续使用你认为是错误的东西。