简而言之:我希望仅根据一个预处理器宏的定义和另一个未定义,从当前源代码树中生成两个不同的源代码树,而不对源代码进行其他更改。
如果您有兴趣,这是我的故事...
一开始,我的代码很清晰。然后我们推出了一个新产品,这确实更好。但代码只涉及相同的外围设备,所以我们可以保持相同的代码。
好吧,几乎是这样。
有一个小条件需要更改,因此我添加了:
当然,有时候理智会休息更长的时间,比如:
这些条件涵盖了从一到两百行不等的内容(你可能认为最后一个可以通过切换头文件来完成,但函数名称需要相同)。
这太疯狂了。我最好在源代码库中维护两个单独的基于产品的分支,并移植任何通用更改。我现在意识到了这一点。
是否有什么东西可以根据仅定义“PRODUCT_A”和未定义“PRODUCT_B”(反之亦然)来生成我需要的两个不同的源代码树,而不接触其他任何东西(即没有头文件包含、没有宏扩展等)?
如果您有兴趣,这是我的故事...
一开始,我的代码很清晰。然后我们推出了一个新产品,这确实更好。但代码只涉及相同的外围设备,所以我们可以保持相同的代码。
好吧,几乎是这样。
有一个小条件需要更改,因此我添加了:
#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
这些条件涵盖了从一到两百行不等的内容(你可能认为最后一个可以通过切换头文件来完成,但函数名称需要相同)。
这太疯狂了。我最好在源代码库中维护两个单独的基于产品的分支,并移植任何通用更改。我现在意识到了这一点。
是否有什么东西可以根据仅定义“PRODUCT_A”和未定义“PRODUCT_B”(反之亦然)来生成我需要的两个不同的源代码树,而不接触其他任何东西(即没有头文件包含、没有宏扩展等)?