因为我们似乎应该避免char
或int
或short
或long
或unsigned
。
"如果您发现自己键入了char或int或short或long或未签名的新代码,那么您从https://matt.sh/howto-c开始做错了#34;。
是否可以指示编译器对此情况发出警告?
答案 0 :(得分:3)
无法让编译器对此发出警告。可能有代码分析工具可以。
要避免它们"总的来说有点苛刻。 char
保证是单个字节,即使在C11中也用于文本,标准库通常使用平台相关类型,例如: int
作为strcmp
的返回值。
答案 1 :(得分:1)
编译器永远不会对它发出警告,因为编译器的工作是检查语言合规性,就语言标准而言,这些类型完全没问题。
如果您需要一个警告使用危险类型的工具,您可以获得MISRA-C检查程序。 MISRA-C指南用于从不安全的C语言中创建安全子集。除其他事项外,MISRA不允许使用上述类型,而是坚持只应使用stdint.h
中的类型。
答案 2 :(得分:0)
许多语言结构是根据内置类型定义的。使用除字符类型以外的抽象类型的代码应该被编写为在替换较大类型时同样有效,并且依赖于抽象类型的代码大于标准中给出的最小大小,并且任何人都可能尝试在系统中运行它们不是,应检查以确保尺寸符合要求。请注意,代码是否实际声明了抽象大小的任何对象都无关紧要。
例如,给定int16_t x; uint16_t y;
,(0xC000+x > 49152-y)
的行为将受int
的影响。如果int
是32位,则将使用有符号值执行计算和比较。但是,如果int
是16位,则左操作数将被评估为16位无符号值,然后提升为long,以便与右侧进行比较,将被评估为有符号长整数。
虽然编写可能与抽象类型的大小无关的代码会很方便,但仅仅假装这些类型不存在将无法实现。