2017-10-12 43 views
3

strlen返回的是size_t,即long unsigned int为什么在将strlen的输出存储在int中时不会发出警告?

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

char msg[] = "Hello"; 
int slen= strlen(msg); 

(我预计long unsigned int slen也有必要避免这样的警告。)

+3

可能取决于您的编译器设置。 –

+5

因为它不必。这种转换是完全合法的。 –

+1

['-Wconversion'](https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html)对于GCC – DaBler

回答

6

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

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

gcc ... -Wstrict-overflow ... 

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

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

这很可能造成大量的编译问题,但它可以是一个好主意,以测试你的代码(A 皮棉类型的东西)。

看看gcc手册会给你关于这些警告的其他细节。

请注意,您也可以使用-Werror标志将警告转换为错误。这种方式编译失败,而不是让你继续你会考虑一个错误的东西。

+4

“默认情况下,C和C++允许您在没有警告的情况下在所有不同类型之间复制整数” - 更准确地说,该语言不需要*警告。编译器可以警告任何他们喜欢的东西,C标准没有说明编译器的默认行为应该是什么。它只是要求符合规范的编译器针对违反语法规则和约束的情况发出诊断信息(事实并非如此) - 许多编译器默认情况下甚至不符合要求。 –

-3

strlen是一个字符串函数,这意味着它期望您提供一个地址作为参数。没有括号的msg意味着你将第一个元素的地址作为参数。 strlen函数将计算不包含终止空字符的数组中的字的数量,从某种意义上说,您将返回一个int,在此示例中slen = 5

+0

这是多个字节,而不是单词。自Win2k以来,USC-16已经不再使用了,它会是一些字(每个字符2个字节)。 –

+0

字符数,而不是字数,我不觉得这个答案为什么没有警告。 'strlen'也返回一个'size_t',而不是'int'。 –

+0

@RetiredNinja,no,'strlen()'只是计算字节并停在第一个''\ 0'处。您需要一个多字节函数来计算'wchar_t'(Windows上的文字,wcslen()')或UTF-8字符串('mbslen()')中的字符。 –

相关问题