12.4. 区分不同的操作系统， 以及 OS 的版本
上一页 | 第 12 章 该做什么和不该做什么 | 下一页

## 12.4. 区分不同的操作系统， 以及 OS 的版本

在不同版本的 Unix 下可能需要对代码进行一些修改或增加少许编译选项， 才能够正确地编译和运行。 如果您需要根据一些条件来对代码进行修改， 请尽可能让这些修改通用， 这样， 我们就能够将这些代码移植回更早的 FreeBSD 系统， 并交叉移植到其它 BSD 系统， 例如来自 CSRG 的 4.4BSD， BSD/386， 386BSD， NetBSD 和 OpenBSD。

推荐的获得 4.3BSD/Reno (1990) 以及更新版本 BSD 代码版本号的方式， 是使用 sys/param.h 中所定义的 `BSD` 宏的值。 一般来说这个文件已经被引用了； 如果没有的话， 增加下述代码：

#if (defined(__unix__) || defined(unix)) && !defined(USG) #include <sys/param.h> #endif

到 `.c` 文件中合适的地方。 我们相信所有定义了这两个符号的系统中， 都提供了 `sys/param.h`。 如果您发现有不这样做的系统， 请通过致信 FreeBSD ports 邮件列表 让我们了解这一情况。

另一种方法是使用 GNU Autoconf 风格的方式：

#ifdef HAVE_SYS_PARAM_H #include <sys/param.h> #endif

采用这种方法时， 不要忘了把 `-DHAVE_SYS_PARAM_H` 加到 `Makefile` 中的 `CFLAGS` 里。

一旦引用了 `sys/param.h`， 您就可以使用：

#if (defined(BSD) && (BSD >= 199103))

来检测代码是否正在 4.3 Net2 代码基础， 或更新的系统上编译 (例如 FreeBSD 1.x， 4.3/Reno， NetBSD 0.9， 386BSD， BSD/386 1.1 以及更高版本)。

使用：

#if (defined(BSD) && (BSD >= 199306))

来检测代码是否正在 4.4 或更新的系统 (例如 FreeBSD 2.x， 4.4， NetBSD 1.0、 BSD/386 2.0 或更高版本)。

对于 4.4BSD-Lite2 代码系来说， `BSD` 宏的值应该是 `199506`。 这里只是作为信息提供， 您不应使用它来区分基于 4.4-Lite 的 FreeBSD 和基于 4.4-Lite2 的版本。 这些情况下， 您应使用 `__FreeBSD__` 宏。

保守地使用：

- `__FreeBSD__` 在所有版本的 FreeBSD 中皆有定义。 如果您正进行的修改 只 影响 FreeBSD， 则应使用这个宏。 类似 `sys_errlist[]` 之于 `strerror()` 这样的移植问题是伯克利代码系公用的， 而并非 FreeBSD 所专有。

- 在 FreeBSD 2.x 中， `__FreeBSD__` 定义为 `2`。 更早版本中， 它曾经是 `1`。 新的版本都会在主要的版本号变化时变更它。

- 如果您需要区分 FreeBSD 1.x 系统和 FreeBSD 2.x 及更高版本的区别， 通常应使用前述的 `BSD` 宏来进行。 如果事实上需要一个 FreeBSD 专有的修改 (例如， 在使用 `ld` 时需要特殊的共享库选项)， 则可以用 `__FreeBSD__` 和 `#if __FreeBSD__ > 1` 来检测 FreeBSD 2.x 和新系统上的变化。 如果需要更细粒度地检测 FreeBSD 2.0-RELEASE 之后版本的变化， 则可以使用：

  #if __FreeBSD__ >= 2 #include <osreldate.h> # if __FreeBSD_version >= 199504 /* 适用于 2.0.5+ 版本的代码 */ # endif #endif

在已有的数百个 port 中， 只有一两个应该使用 `__FreeBSD__`。 早期的 port 在不适当的地方使用了它并引发问题， 并不意味着您也必定如此。

上一页 | 上一级 | 下一页
12.3. `WRKDIRPREFIX` (用于联编的临时目录的父目录名) | 起始页 | 12.5. __FreeBSD_version 值

本文档和其它文档可从这里下载： ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

如果对于FreeBSD有问题，请先阅读 文档，如不能解决再联系 <questions@FreeBSD.org>.
关于本文档的问题请发信联系 <doc@FreeBSD.org>.