C 为什么在int中存储strlen的输出时不发出警告?
C 为什么在int中存储strlen的输出时不发出警告?,c,unsigned,signed,C,Unsigned,Signed,strlen返回的类型是size\u t,即long unsigned int 为什么编译以下代码不会发出有关slen的签名的警告 char msg[] = "Hello"; int slen= strlen(msg); (我预计长无符号int SLIN将避免这种警告。) < P> C和C++语言允许在没有警告的情况下复制所有不同类型之间的整数(编译器可以默认地警告您,一些则使用 char < /C> >,这是一个臭名昭著的例外)。 使用gcc可以使用此警告来避免丢失高位(因此longtoin
strlen
返回的类型是size\u t
,即long unsigned int
为什么编译以下代码不会发出有关slen的签名的警告
char msg[] = "Hello";
int slen= strlen(msg);
(我预计长无符号int SLIN<代码>将避免这种警告。)
< P> C和C++语言允许在没有警告的情况下复制所有不同类型之间的整数(编译器可以默认地警告您,一些则使用<代码> char < /C> >,这是一个臭名昭著的例外)。
使用gcc
可以使用此警告来避免丢失高位(因此long
toint
将在32位机器上发出警告)
gcc-Wstrict溢出。。。
还有一个用于防止自动转换的标志:
gcc-Wno整数转换。。。
这可能会导致很多编译问题,但是测试代码(lint类型的东西)是个好主意
查看gcc
手册将为您提供有关这些警告的其他详细信息
请注意,您还可以使用-Werror
标志将警告转换为错误。这样编译失败了,而不是让你继续使用那些你认为是bug的东西。可能取决于编译器的设置。因为它不需要。这种转换是完全合法的。对于GCCsize\u t
,在您使用的实现中正好是unsigned long int
。不一定是这样。它只是一些大的无符号整数类型,足以容纳对象的大小。“默认情况下,C和C++允许在没有警告的情况下复制所有不同类型的整数”——更准确地说,语言不需要警告。编译器可以警告他们喜欢的任何东西,而C标准没有说明编译器的默认行为应该是什么。它只需要符合要求的编译器对违反语法规则和约束的行为进行诊断(事实并非如此)——许多编译器在默认情况下甚至都不符合要求。