简而言之:我想从当前的源树中生成两棵不同的源树,仅基于一个已定义的预处理器宏和另一个未定义的预处理器宏,而不对源进行其他更改。
如果你有兴趣的话,这是我的故事......
一开始,我的代码很干净。然后我们做了一个新产品,是的,它更好了。但代码只看到相同的外围设备,因此我们可以保留相同的代码。
嗯,差不多了。
有一个小条件需要改变,所以我补充道:
#if defined(PRODUCT_A)
condition = checkCat();
#elif defined(PRODUCT_B)
condition = checkCat() && checkHat();
#endif
...到一个且仅有一个源文件。在一般的所有源文件包含此头文件中,我有:
#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 到两百行(您可能认为最后一个可以通过切换头文件来完成,但函数名称需要相同)。
疯了吧。我最好在源存储库中维护两个独立的基于产品的分支并移植任何常见的更改。我现在意识到了这一点。
有没有什么东西可以生成我需要的两个不同的源树,仅基于PRODUCT_A
被定义和PRODUCT_B
未定义(反之亦然),without触及其他任何内容(即不包含标头、不宏扩展等)?