我必须承认,主要由于Microsoft,我仍然编写伪C89代码(不完全符合C99)。我在Windows方面非常依赖MSVC,但它们仍然不完全符合C99,而是将大部分精力放在C ++ 17及更高版本上。
最重要的是,我正在开发C SDK,许多插件开发人员都在其中使用MSVC进行插件开发,还有一些仍使用MSVC2010。因此,仍然有流行的编译器在不那么奇特的平台上广泛使用(除非您考虑Windows异国)甚至还没有完全实现C99。当您希望与最大范围的编译器具有广泛的兼容性(这是SDK是用C而不是C ++编写的主要原因之一)时,仍然有许多被广泛使用(至少是MSVC),这在当时是落后的关于C支持。自C99以来已经过去了二十年,而且我们仍然没有VLA,例如,在MSVC AFAIK中(尚未检查MSVC 2017,但考虑到Microsoft对C的立场,我怀疑它是否更符合C99) 。
因此,不幸的是,仍然有一些新的编译器,它们实际上非常好,并且还具有良好的优化器和调试器,它们甚至还不完全符合C99。当然,如果不是因为这个原因,我会跳过C11。
除了与插件和MSVC的源兼容性外,还可以与其他语言互操作。其他一些语言通过FFI使用SDK,其中一些FFI仅了解C89。从dylib导入函数时,他们可能不理解bool
或仅_Bool
作为一个简单示例,而仅理解int
。
是的,赞成的观点是可移植性,但是问题是,是否实际上有非假设的系统只能使用C89编译器,但正在编译新的软件发行版。即,如果我正在开始一个新的C项目,我如何确定坚持使用C89是否可以增加潜在用户的数量?
只是注意到了这一点,但在某种程度上是呼应Blrfl
,在我看来,使用C99和C11所带来的生产率提升并不是那么巨大,而失去允许人们使用MSVC编写插件的能力可能会是一笔巨大的成本(尤其是因为我使用的产品到目前为止,Windows上的Windows XP拥有最大的市场份额,普通用户经常购买和下载许多第三方插件。我从事的产品类型几乎介于程序员/脚本开发环境和艺术家的用户端产品之间,因为许多人都希望在其基础上开发新产品,以提供新功能并实现特殊功能。善良的人们还没有看到。因此,就我而言,至少对于SDK而言,支持C89实际上是一个非常简单的决定。
我想您必须对周围的编译器有所了解,并尝试找出目标人群。如果您不是要为Windows开发插件体系结构,也不是进行任何嵌入式编程,也不是尝试构建可被最广泛的编译器和语言使用的软件开发工具包,那么对于C99 +而言,它无疑将使事情变得更加容易。远。也可以考虑从C99开始获得多少生产力提升。我从VLA之类的应用程序中受益匪浅,因为我依靠足够简单的方法在数据适合时使用堆栈,否则就进行堆放。
但是,从诸如MSVC之类的流行编译器到其他语言的FFI,还有很多事情是落后的,这很酷,因为它们可以直接从dylib导入和调用C函数,但在功能上也可能有些落后次。因此,根据您的领域,还有很多实际的业务要考虑的事项,而不是仅仅出于某种美感而偏爱老式的和标准化的。