如何摆脱大型c项目中的ifdef

ilc*_*edo 5 c conditional-compilation visual-c++ c-preprocessor

我得到了一个用C编码的开源项目.它使用#ifdef进行交叉编译.整个源代码中有很多ifdef.我想只为一个平台修改它.我想通过编译器的预处理器(Visual C++)来运行它,但它会将预处理的结果写入一个我不需要的文件.有人知道一种方法来预处理项目,保持其结构完整(所有文件完好无损)?请不要grep.

编辑:

我发现了一个潜在的解决方案(这些天你可以在互联网上找到它真是太棒了).它是boost.wave - 一个C++预处理器库,可以做一些有趣的事情.我不知道结果如何,但我会尝试一下.不过,这不是最终答案,所以如果你有解决方案,那么我会很高兴听到它.

Jon*_*ler 5

我知道有两种工具可以用来半自动完成.

一个是sunifdef(儿子的unifdef).AFAIK虽然不再维护(但unifdef它也不是基于它).

另一个是coan,正在积极维护,并且是一个发展sunifdef.

另请参阅:是否有C预处理器#ifdef根据定义/未定义的值消除块?.

实际上,我仍在使用sunifdef主要项目,我正在从代码库中删除过时的代码(例如,自1996年以来不支持的机器).我唯一遇到的问题是,如果一行用这样的括号进入:

#if (defined(MACH_A) && defined(PROP_P)) || (defined(MACH_B) && defined(PROP_Q)) || \
    (defined(MACH_C) && defined(PROP_R))
Run Code Online (Sandbox Code Playgroud)

我们有-UMACH_C(所以不再支持机器C),输出行是:

#if defined(MACH_A) && defined(PROP_P) || defined(MACH_B) && defined(PROP_Q)
Run Code Online (Sandbox Code Playgroud)

从技术上讲,这很好; 它是正确的.最好在表达式中保留额外的,技术上冗余的括号.

一个警告:虽然我可以回答基于Unix的系统上的这些编译,但我没有亲自在Windows上检查它们.