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
to
int
将在32位机器上发出警告)

gcc-Wstrict溢出。。。
还有一个用于防止自动转换的标志:

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

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


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

可能取决于编译器的设置。因为它不需要。这种转换是完全合法的。对于GCC
size\u t
,在您使用的实现中正好是
unsigned long int
。不一定是这样。它只是一些大的无符号整数类型,足以容纳对象的大小。“默认情况下,C和C++允许在没有警告的情况下复制所有不同类型的整数”——更准确地说,语言不需要警告。编译器可以警告他们喜欢的任何东西,而C标准没有说明编译器的默认行为应该是什么。它只需要符合要求的编译器对违反语法规则和约束的行为进行诊断(事实并非如此)——许多编译器在默认情况下甚至都不符合要求。