【问题标题】:Why no warning is issued when storing the output of strlen in an int?为什么将 strlen 的输出存储在 int 中时不发出警告?
【发布时间】:2017-10-12 21:42:14
【问题描述】:

strlen 返回的类型是size_t,也就是long unsigned int

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

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

(我预计long unsigned int slen 是避免此类警告所必需的。)

【问题讨论】:

  • 可能取决于您的编译器设置。
  • 因为没必要。这种转换是完全合法的。
  • -Wconversion 为 GCC
  • size_t 在您正在使用的实现中恰好是 unsigned long int。它不一定是。它必须是某种无符号整数类型,足以容纳对象的大小。

标签: c unsigned signed


【解决方案1】:

C 和 C++ 语言允许您在所有不同类型之间复制整数而不会发出警告(编译器默认情况下会发出警告,有些会使用 char,这是一个臭名昭著的例外)。

使用gcc,您可以使用此警告来避免丢失高位(因此long longint 会在32 位机器上给您一个警告)。

gcc ... -Wstrict-overflow ...

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

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

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

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

请注意,您还可以使用-Werror 标志将警告转换为错误。这样编译就会失败,而不是让您继续处理您认为是错误的事情。

【讨论】:

  • "默认情况下,C 和 C++ 允许您在所有不同类型之间复制整数而不会发出警告" -- 更准确地说,该语言不需要要求 警告。编译器可以警告他们喜欢的任何东西,而 C 标准没有说明编译器的默认行为应该是什么。它只需要符合标准的编译器就违反语法规则和约束(这不是)发出诊断 - 许多编译器默认情况下甚至不符合标准。
猜你喜欢
  • 2011-06-25
  • 2020-05-03
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多