在大多数情况下,更高版本是早期版本的超集 . 虽然尝试使用 restrict 作为标识符的C89代码将被C99添加具有相同拼写的保留字而打破,并且在某些情况下,设计用于利用解析器的某些极端情况的代码将被区别对待在这两种语言中,大多数不太可能是重要的 .
然而,更重要的问题与内存别名有关 . C89包括限制可用于访问某些对象的指针类型的规则 . 由于规则会使像malloc()这样的函数无法用,如果它们按照书面形式应用于由此创建的对象,大多数程序员和编译器编写者都将规则视为仅适用于有限的情况(我怀疑C89会被广泛接受,如果人们不相信这些规则只适用于狭义的) . C99声称这些规则,但它的新规则实际上比对旧规则的解释更为广泛,破坏了许多本能在C89的常见解释下定义行为的代码,甚至一些代码可能具有在C89下明确定义没有实用的C99等价物 .
例如,在C89中, memcpy 可用于将与任何类型的对象关联的位模式复制到具有相同大小的任何其他类型的对象,在任何情况下,该位模式将表示目标类型中的有效值 . 如果 memcpy 用于将某种类型T的对象复制到没有声明类型的存储(例如,从 malloc 返回的存储),则C99添加了允许编译器以任意方式运行的语言,然后该存储被读作类型的对象't alias-compatible with T--even if the bit pattern of the original object would have a valid meaning in the new type. Further, the rules that apply to memcpy also apply in cases where an object is copied as an array of character type--without clarifying exactly what that means--so it'不清楚究竟需要做什么代码才能实现与C89 memcpy 匹配的行为 .
在许多编译器上,可以通过在命令行中添加 -fno-strict-aliasing 选项来解决此类问题 . 注意指定C89模式可能还不够,因为编译器编写者经常使用相同的内存语义,无论他们应该实现哪种标准 .