简而言之:我想从当前的源代码生成两个不同的源树,只基于一个预处理器宏被定义,另一个未定义,没有对源进行其他更改。
如果你有兴趣,这是我的故事...
一开始,我的代码很干净。然后我们制作了一个新产品,是的,它更好。但是代码只看到了相同的外围设备,所以我们可以保持相同的代码。
嗯,差不多。
有一个小条件需要改变,所以我补充道:
#if defined(PRODUCT_A)
condition = checkCat();
#elif defined(PRODUCT_B)
condition = checkCat() && checkHat();
#endif
...到一个且只有一个源文件。在一般的all-source-files-include-this头文件中,我有:
#if !(defined(PRODUCT_A)||defined(PRODUCT_B))
#error "Don't make me replace you with a small shell script. RTFM."
#endif
...除非他们明确定义了产品类型,否则人们无法编译它。
一切都很好。哦...除了修改,组件改变,并且由于新硬件工作得更好,我们可以重新编写控制系统。现在,当我查看代码的表面时,有超过60个单独的区域描述:
#ifdef PRODUCT_A
...
#else
...
#endif
...或相同,但适用于PRODUCT_B
。甚至:
#if defined(PRODUCT_A)
...
#elif defined(PRODUCT_B)
...
#endif
当然,有时候理智需要更长的假期,而且:
#ifdef PRODUCT_A
...
#endif
#ifdef PRODUCT_B
...
#endif
这些条件包装从1到 200行(您认为最后一个可以通过切换头文件来完成,但函数名称必须相同)。
这太疯狂了。我最好在源代码库中维护两个独立的基于产品的分支并移植任何常见的更改。我现在意识到这一点。
是否存在可以生成我需要的两个不同源树的东西,仅基于PRODUCT_A
被定义且PRODUCT_B
未定义(反之亦然),没有触摸其他任何东西(即没有标题包含,没有宏扩展等)?
答案 0 :(得分:6)
我相信Coan会做你想要的。从链接:
考虑到配置和一些源代码,Coan可以回答一系列问题,如果事先已经应用了符号配置,那么源代码将如何呈现给C / C ++预处理器。
还有:
Coan重写的源代码不是由C预处理器生成的预处理代码。它仍然包含注释,宏调用和#-directives。它仍然是源代码,但根据所选配置进行了简化。
因此,您可以运行两次,首先指定产品A,然后指定产品B.