如果您需要修改现有代码以将其移植到 Linux,您可能需要使用ifdef...endif对来包围 Linux 特定代码的部分——或者,就此而言,对应于其他实现的代码。选择要基于操作系统编译的代码部分的真实标准并不存在,但许多程序使用诸如定义以下的约定SVR4用于 System V 代码,BSD用于 BSD 代码,以及linux用于 Linux 特定代码。
Linux 使用的 GNU C 库允许您通过在编译时定义各种宏来启用库的各种功能。这些是
如果您定义_BSD_SOURCE自己,则额外的定义_FAVOR_BSD将为库定义。 这将导致在某些情况下选择 BSD 行为而不是 POSIX 或 SVR4。例如,如果_FAVOR_BSD被定义,则 setjmp 和 longjmp 将保存和恢复信号掩码,并且 getpgrp 将接受 PID 参数。 请注意,您仍然必须链接到libbsd以获得本文前面提到的功能的类 BSD 行为。
在 Linux 下,gcc自动定义了许多您可以在程序中使用的宏。这些是
#ifdef linux来包围 Linux 特定代码。 使用这些编译时宏,您可以轻松地调整现有代码,以包含或排除将程序移植到 Linux 所需的更改。 请注意,由于 Linux 通常支持更多类似 System V 的功能,因此对于为 System V 和 BSD 编写的程序,最好的代码库可能是 System V 版本。 或者,您可以从 BSD 基础开始并链接到libbsd.