C代码的可靠可移植性,而不依赖于预处理器

时间:2010-04-19 01:36:58

标签: c build build-automation makefile

依靠预处理器和预定义的编译器宏来实现可移植性似乎很难管理。什么是实现C项目可移植性的更好方法?我想将特定于环境的代码放在标题中,行为方式相同。有没有办法让构建环境选择要包含哪些标题?

我在考虑将特定于环境的标头放入特定环境的目录中。然后,构建环境只是将标题从平台的目录复制到根目录,构建项目,然后删除副本。

3 个答案:

答案 0 :(得分:6)

这完全取决于你的构建环境,当然与C本身无关。

您可以尝试的一件事是在makefile中设置包含路径:

INCDIRS=-I ./solaris
#INCDIRS=-I ./windows
#INCDIRS=-I ./linux
:
CC=gcc $(INCDIRS) ...

并取消注释您正在处理的那个。然后将特定于平台的标头放在这些目录中:

./solaris/io.h
./windows/io.h
./linux/io.h

你可以在紧要关头拥有不同的平台制作文件,例如solaris.mkwindows.mk,而不必编辑任何文件。

但是我没有看到你对预处理器的厌恶,这是它擅长的事情之一,人们几十年来一直在成功地做到这一点。最重要的是,当代码需要更改每个平台时会发生什么。您可以将代码抽象为头文件,但这对我来说似乎要比管理#ifdef更难。

答案 1 :(得分:3)

这基本上就是配置脚本所做的事情 - 即计算出系统的细节,然后修改该系统的makefile。看看GNU autoconf的文档,它可能会做你想要的,虽然我不确定如果有必要,它对Windows的可移植性。

答案 2 :(得分:2)

pax's answer很好,但我会补充说你可以

  1. 混合搭配处理构建系统中的一些系统依赖(通常是大事)和其他与预处理器(小东西)的依赖
  2. 确定问题在代码和系统相关位之间定义一个薄胶层,并将所有预处理器废话放在那里。所以你总是打电话给MyFileOpen()调用unix上的fopen和windows上的其他内容。现在,代码中唯一具有与文件打开相关的预处理程序的部分是MyFileOps模块。