关于 char 或 int 或 short 或 long 或 unsigned 的警告
Warning on char or int or short or long or unsigned
因为看起来我们应该避免 char
或 int
或 short
或 long
或 unsigned
.
"If you find yourself typing char or int or short or long or unsigned into new code, you're doing it wrong",来自 https://matt.sh/howto-c。
是否可以指示编译器对这种情况发出警告?
不可能让编译器对此发出警告。可能有代码分析工具可以。
总的来说"avoid them"有点苛刻。 char
保证是单字节,甚至在 C11 中也用于文本,标准库通常使用平台相关类型,例如int
作为 strcmp
的 return 值。
编译器永远不会发出警告,因为编译器的工作是检查语言合规性,而就语言标准而言,这些类型完全没问题。
如果您需要针对使用危险类型发出警告的工具,您可以获得 MISRA-C 检查器。 MISRA-C 指南用于从不安全的 C 语言中创建一个安全的子集。除其他事项外,MISRA 不允许使用上述类型,而是坚持只应使用 stdint.h
中的类型。
许多语言结构都是根据内置类型定义的。使用字符类型以外的抽象类型的代码应该被编写为在替换更大的类型时同样有效,并且依赖抽象类型的代码大于标准中给出的最小大小,并且任何人都可能尝试 运行 在不存在的系统上,应检查以确保大小符合要求。请注意,代码是否实际声明了任何抽象大小的对象并不重要。
例如,给定 int16_t x; uint16_t y;
(0xC000+x > 49152-y)
的行为将受到 int
大小的影响。如果 int
是 32 位,则将使用有符号值执行计算和比较。但是,如果 int
是 16 位,则左侧操作数将被评估为 16 位无符号值,然后提升为 long,以便与将被评估为有符号 long 的右侧进行比较。
虽然编写与抽象类型的大小无关的代码会很方便,但仅仅假装此类类型不存在并不能实现这一点。
因为看起来我们应该避免 char
或 int
或 short
或 long
或 unsigned
.
"If you find yourself typing char or int or short or long or unsigned into new code, you're doing it wrong",来自 https://matt.sh/howto-c。
是否可以指示编译器对这种情况发出警告?
不可能让编译器对此发出警告。可能有代码分析工具可以。
总的来说"avoid them"有点苛刻。 char
保证是单字节,甚至在 C11 中也用于文本,标准库通常使用平台相关类型,例如int
作为 strcmp
的 return 值。
编译器永远不会发出警告,因为编译器的工作是检查语言合规性,而就语言标准而言,这些类型完全没问题。
如果您需要针对使用危险类型发出警告的工具,您可以获得 MISRA-C 检查器。 MISRA-C 指南用于从不安全的 C 语言中创建一个安全的子集。除其他事项外,MISRA 不允许使用上述类型,而是坚持只应使用 stdint.h
中的类型。
许多语言结构都是根据内置类型定义的。使用字符类型以外的抽象类型的代码应该被编写为在替换更大的类型时同样有效,并且依赖抽象类型的代码大于标准中给出的最小大小,并且任何人都可能尝试 运行 在不存在的系统上,应检查以确保大小符合要求。请注意,代码是否实际声明了任何抽象大小的对象并不重要。
例如,给定 int16_t x; uint16_t y;
(0xC000+x > 49152-y)
的行为将受到 int
大小的影响。如果 int
是 32 位,则将使用有符号值执行计算和比较。但是,如果 int
是 16 位,则左侧操作数将被评估为 16 位无符号值,然后提升为 long,以便与将被评估为有符号 long 的右侧进行比较。
虽然编写与抽象类型的大小无关的代码会很方便,但仅仅假装此类类型不存在并不能实现这一点。