为多个 UNIX 平台编写软件
2008-11-13 08:29:12 来源:WEB开发网还可以在 if..else..endif 部分中使用 #ifndef 来检查是否已定义某个指令,使用 #elif 来检查其他的指令。
可以在整个源代码中使用相同的系统。例如,可以使用它包含不同的头文件(清单 2)和在 localtime() 函数处理前处理遇到的差异。
清单 2. 选择头文件
#ifdef SOLARISX86
#include <iso/time_iso.h>
#else
#include <time.h>
#endif
需要在整个代码中都采用相同的原则(假定知道需要什么内容)。
头文件差异
在不同的 UNIX 变体之间进行迁移所遇到的最常见问题是操作系统中提供的用于定义结构、变量类型和函数的头文件。
一些头文件具有不同位置。例如,limits.h 的内容或多或少算得上是 UNIX 平台上的标准头文件,但位于不同的目录中。例如,在 AIX 内,将使用以下代码导入该头文件:
#include <sys/limits.h>
但在 Solaris 内要使用以下代码:
#include <limits.h>
在某些情况下,所需的信息或许不位于相同的文件中,或者与在原始平台中使用的定义不同,或者直接不可用。
在前一种情况,您需要找到所需的函数定义、结构或变量的位置。最后的方法是使用 grep 来搜索位置,如下面的代码中所示(在 Solaris 主机上查找 PIPE_MAX 定义)。
$ find /usr/include -exec grep -il PIPE_MAX {} ;
/usr/include/sys/param.h
/usr/include/limits.h
所查找的定义与源平台上的定义匹配时,则可以根据情况插入备选定义。不过,请注意,不要更改系统或库调用的含义;更改前台函数定义并不会改变基础库函数。
如果定义不存在,则可能表明其所依赖的库或接口不存在。
更多精彩
赞助商链接