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

Spa*_*ler 3 c unsigned signed

类型strlen返回是size_t,即long unsigned int.

为什么编译以下代码不会发出关于签名的警告slen

char msg[] = "Hello";
int slen= strlen(msg);
Run Code Online (Sandbox Code Playgroud)

(我希望long unsigned int slen有必要避免这样的警告.)

Ale*_*lke 6

C和C++语言允许您在没有警告的情况下复制所有不同类型之间的整数(编译器默认情况下会给您一个警告,有些人会这样做char,这是一个臭名昭着的例外).

有了gcc你可以使用这个警告,以避免失去的高位(所以long longint会给你在32位机器的警告).

gcc ... -Wstrict-overflow ...
Run Code Online (Sandbox Code Playgroud)

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

gcc ... -Wno-int-conversion ...
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • "默认情况下,C和C++允许您在所有不同类型之间复制整数而不发出警告" - 说这种语言不需要*警告会更准确.编译器可以警告任何他们喜欢的东西,C标准没有说明编译器的默认行为应该是什么.它只需要符合条件的编译器就违反语法规则和约束(这不是)进行诊断 - 并且许多编译器默认情况下甚至不符合要求. (4认同)