下一节: , 上一节: , 上级: C 语言编程   [目录][索引]


5.7 调用系统函数

在历史上,C 语言的实现差异很大,而且许多系统缺乏 ANSI/ISO C89 的完整实现。然而,现在所有实际的系统都有 C89 编译器,而 GNU C 支持几乎所有 C99 和一些 C11 的特性。类似地,大多数系统实现了 POSIX.1-2001 库和工具,并且许多系统拥有 POSIX.1-2008。

因此,几乎没有理由支持旧的 C 语言或非 POSIX 系统,您可能希望利用标准的 C 和 POSIX 来编写更清晰、更易移植或更快的代码。您应该尽可能使用标准接口;但是,如果 GNU 扩展使您的程序更易于维护、更强大或更好,请不要犹豫使用它们。无论如何,不要自己声明系统函数;这会引发冲突。

尽管有标准,几乎每个库函数在某些系统上都存在某种可移植性问题。以下是一些示例:

open

在许多平台上,带有尾随 / 的名称处理不当。

printf

long double 可能未实现;浮点值 Infinity 和 NaN 通常处理不当;高精度的输出可能不正确。

readlink

可能返回 int 而不是 ssize_t

scanf

在 Windows 上,失败时不会设置 errno

Gnulib 在这方面有很大帮助。Gnulib 在许多缺乏标准接口的系统上提供了标准接口的实现,包括增强的 GNU 接口的可移植实现(从而使其使用具有可移植性),以及 POSIX-1.2008 接口,其中一些接口即使在最新的 GNU 系统上也缺失。

Gnulib 还提供了许多有用的非标准接口;例如,标准数据结构(哈希表、二叉树)的 C 语言实现、用于内存分配函数的错误检查类型安全包装器(xmallocxrealloc)以及错误消息的输出。

Gnulib 与 GNU Autoconf 和 Automake 集成,以减轻程序员编写可移植代码的负担:Gnulib 使您的配置脚本自动确定缺少哪些功能,并使用 Gnulib 代码来提供缺失的部分。

Gnulib 和 Autoconf 手册都有关于可移植性的广泛章节:在 Gnulib 中查看 Introduction,在 Autoconf 中查看 Portable C and C++。请参考它们以获取更多详细信息。


下一节: , 上一节: , 上级: C 语言编程   [目录][索引]