依靠预处理器和预定义的编译器宏来实现可移植性似乎很难管理。什么是实现C项目可移植性的更好方法?我想将特定于环境的代码放在标题中,行为方式相同。有没有办法让构建环境选择要包含哪些标题?
我在考虑将特定于环境的标头放入特定环境的目录中。然后,构建环境只是将标题从平台的目录复制到根目录,构建项目,然后删除副本。
答案 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.mk
和windows.mk
,而不必编辑任何文件。
但是我没有看到你对预处理器的厌恶,这是它擅长的事情之一,人们几十年来一直在成功地做到这一点。最重要的是,当代码需要更改每个平台时会发生什么。您可以将代码抽象为头文件,但这对我来说似乎要比管理#ifdef
更难。
答案 1 :(得分:3)
这基本上就是配置脚本所做的事情 - 即计算出系统的细节,然后修改该系统的makefile。看看GNU autoconf的文档,它可能会做你想要的,虽然我不确定如果有必要,它对Windows的可移植性。
答案 2 :(得分:2)
pax's answer很好,但我会补充说你可以
MyFileOpen()
调用unix上的fopen
和windows上的其他内容。现在,代码中唯一具有与文件打开相关的预处理程序的部分是MyFileOps模块。