分隔特定的 #ifdef 分支

2023-12-25

简而言之:我想从当前的源树中生成两棵不同的源树,仅基于一个已定义的预处理器宏和另一个未定义的预处理器宏,而不对源进行其他更改。

如果你有兴趣的话,这是我的故事......

一开始,我的代码很干净。然后我们做了一个新产品,是的,它更好了。但代码只看到相同的外围设备,因此我们可以保留相同的代码。

嗯,差不多了。

有一个小条件需要改变,所以我补充道:

#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触及其他任何内容(即不包含标头、不宏扩展等)?


我相信Coan http://coan2.sourceforge.net/index.php?page=about会做你正在寻找的事情。从链接:

给定配置和一些源代码,Coan 可以回答一系列问题,即如果提前应用了符号配置,源代码将如何出现在 C/C++ 预处理器中。

并且:

Coan 重写的源代码不是 C 预处理器生成的预处理代码。它仍然包含注释、宏调用和 # 指令。它仍然是源代码,但根据所选配置进行了简化。

因此,您可以运行它两次,首先指定产品 A,然后指定产品 B。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

分隔特定的 #ifdef 分支 的相关文章

随机推荐