【发布时间】:2010-12-10 14:03:16
【问题描述】:
我正在尝试简化大量遗留 C 代码,在这些代码中,即使在今天,在维护它的构建人员之前需要一个源文件并手动修改以下部分编译基于各种类型的环境。
示例如下,但问题是这里。我对我的 C 生疏了,但我记得不鼓励使用 #ifdef。你们能提供更好的选择吗?另外 - 我认为其中一些(如果不是全部)可以设置为环境变量或作为参数传入,如果是这样 - 定义这些然后从源代码访问的好方法是什么?
这是我正在处理的代码的 sn-p
#define DAN NO
#define UNIX NO
#define LINUX YES
#define WINDOWS_ES NO
#define WINDOWS_RB NO
/* Later in the code */
#if ((DAN==1) || (UNIX==YES))
#include <sys/param.h>
#endif
#if ((WINDOWS_ES==YES) || (WINDOWS_RB==YES) || (WINDOWS_TIES==YES))
#include <param.h>
#include <io.h>
#include <ctype.h>
#endif
/* And totally insane harcoded paths */
#if (DAN==YES)
char MasterSkipFile[MAXSTR] = "/home/dp120728/tools/testarea/test/MasterSkipFile";
#endif
#if (UNIX==YES)
char MasterSkipFile[MAXSTR] = "/home/tregrp/tre1/tretools/MasterSkipFile";
#endif
#if (LINUX==YES)
char MasterSkipFile[MAXSTR] = "/ptehome/tregrp/tre1/tretools/MasterSkipFile";
#endif
/* So on for every platform and combination */
【问题讨论】:
-
您使用的是哪种构建系统?我注意到 Linux、Unix 和 Windows 的定义,所以没有明显的候选者。如果不了解构建系统,将很难提供帮助。 FWIW,#ifdef 在多平台代码中至关重要,而且几乎不气馁,尽管您看到它可能会被糟糕地使用。
-
同意 - 诀窍是使用它,而不是避免使用它。构建系统对此有很大帮助 - 例如,整个 autoconf 管道可以自动生成一个 config.h,您的所有代码都包含该 config.h 以获得适当的#defines。
-
主要是在 *nix 上构建的,所以假设 makefile。这反过来将由 exec-maven-plugin 触发,因为这只是整体构建所涵盖的非常分散的代码库的一部分
-
大家好 - 非常感谢您的 cmets 和建议,这就是我喜欢 Stackoverflow 的原因。在宣布获胜者之前,我会花一些时间进行分析和原型设计 :)
标签: c c-preprocessor conditional-compilation hardcoded