我喜欢“复数类型的 GNU 扩展”的语法,但我知道它不像 complex.h 那样是标准的。那么,我应该使用哪个?
2 回答
这真的是一个对你来说最重要的问题。
如果有一天您有可能想要在除 gnu 之外的任何编译器上使用该代码,那么使用来自<complex.h>
.
如果您有理由确定您只是针对 gnu 编译器,或者至少考虑到它们提供的语法改进值得您最终可能不得不重写代码,那么使用 gnu 扩展可能更有意义。 .
至少对我来说,这将归结为一个相当简单的情况:如果代码(甚至合理地)可移植,否则我也会遵循复杂类型的标准。如果代码使用了足够多的 gnu 扩展,否则移植到另一个编译器可能需要(几乎)完全重写,那么如果您更喜欢 gnu 扩展,则不妨使用它们。
我还应该补充一点,移植并不是唯一的考虑因素,但它们都可以协同工作。可读性的工作方式几乎相同——如果你使用了足够多的 gnu 扩展,以至于有人非常需要了解 gnu 扩展来阅读代码,那么使用他们的扩展来处理复杂的代码不会有一点损失。如果代码足够标准以至于有人可以阅读它,那么仅为复杂而添加专有扩展可能不是一个好主意。
任何一个都会导致可移植性问题。您必须根据需要代码使用的编译器集来决定。
<complex.h>
当然,C99是标准语言的一部分——但并非所有编译器都支持 C99。特别是,微软表示他们不打算支持 C99 或任何更高版本的标准,除了那些恰好存在于 C++ 中的功能。(C++ 支持复数,但作为一个库,而不是像 C99 那样的内置类型集。)
另一方面,gcc 扩展仅适用于 gcc,或与 gcc 充分兼容的编译器。
我怀疑这<complex.h>
将比 gcc 扩展更便携;您将无法将 Microsoft 的编译器与任何一个一起使用,但任何支持 C99 的实现都将支持<complex.h>
.
(另一种选择是使用 C++ 而不是 C,并使用 C++ 的<complex>
.)