为什么将 strlen 的输出存储在 int 中时没有发出警告?
Why no warning is issued when storing the output of strlen in an int?
类型strlen
returns是size_t
,即long unsigned int
。
为什么编译以下代码不会发出有关 slen
的签名的警告?
char msg[] = "Hello";
int slen= strlen(msg);
(我预计 long unsigned int slen
是避免此类警告所必需的。)
C 和 C++ 语言允许您在所有不同类型之间复制整数而不会发出警告(编译器可以默认给您警告,有些 char
会发出警告,这是一个臭名昭著的例外)。
使用 gcc
你可以使用这个警告来避免丢失高位(所以 long long
到 int
会在 32 位机器上给你一个警告)。
gcc ... -Wstrict-overflow ...
还有一个标志可以防止自动转换:
gcc ... -Wno-int-conversion ...
这可能会导致很多编译问题,但测试您的代码(lint 类型的东西)可能是个好主意。
查看 gcc
手册将为您提供有关这些警告的其他详细信息。
请注意,您还可以使用 -Werror
标志将警告转换为错误。这样编译就会失败,而不是让您继续处理您认为是错误的事情。
类型strlen
returns是size_t
,即long unsigned int
。
为什么编译以下代码不会发出有关 slen
的签名的警告?
char msg[] = "Hello";
int slen= strlen(msg);
(我预计 long unsigned int slen
是避免此类警告所必需的。)
C 和 C++ 语言允许您在所有不同类型之间复制整数而不会发出警告(编译器可以默认给您警告,有些 char
会发出警告,这是一个臭名昭著的例外)。
使用 gcc
你可以使用这个警告来避免丢失高位(所以 long long
到 int
会在 32 位机器上给你一个警告)。
gcc ... -Wstrict-overflow ...
还有一个标志可以防止自动转换:
gcc ... -Wno-int-conversion ...
这可能会导致很多编译问题,但测试您的代码(lint 类型的东西)可能是个好主意。
查看 gcc
手册将为您提供有关这些警告的其他详细信息。
请注意,您还可以使用 -Werror
标志将警告转换为错误。这样编译就会失败,而不是让您继续处理您认为是错误的事情。