单独的特定#ifdef分支

det*_*tly 6 c-preprocessor

简而言之:我想从当前的源代码生成两个不同的源树,仅基于一个预定义宏定义而另一个未定义,而没有对源进行其他更改.

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

一开始,我的代码很干净.然后我们制作了一个新产品,是的,它更好.但代码只看到相同的外围设备,所以我们可以保持相同的代码.

好吧,差不多.

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

#if defined(PRODUCT_A)
condition = checkCat();
#elif defined(PRODUCT_B)
condition = checkCat() && checkHat();
#endif
Run Code Online (Sandbox Code Playgroud)

...到一个且只有一个源文件.在一般的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
Run Code Online (Sandbox Code Playgroud)

...除非他们明确定义了产品类型,否则人们无法编译它.

一切都好.哦...除了修改,组件改变,并且由于新硬件工作得更好,我们可以重新编写控制系统.现在,当我查看代码的表面时,有超过60个单独的区域:

#ifdef PRODUCT_A
...
#else
...
#endif
Run Code Online (Sandbox Code Playgroud)

...或者相同,但是PRODUCT_B.甚至:

#if defined(PRODUCT_A)
...
#elif defined(PRODUCT_B)
...
#endif
Run Code Online (Sandbox Code Playgroud)

当然,有时候理智需要更长的假期,并且:

#ifdef PRODUCT_A
...
#endif
#ifdef PRODUCT_B
...
#endif
Run Code Online (Sandbox Code Playgroud)

这些条件包装了一到两百行(您认为最后一行可以通过切换头文件来完成,但函数名称必须相同).

疯了吧.我最好在源代码库中维护两个独立的基于产品的分支并移植任何常见的更改.我现在意识到这一点.

是否存在可以生成我需要的两个不同源树的东西,仅基于PRODUCT_A被定义和PRODUCT_B未定义(反之亦然),而不接触任何其他东西(即没有包含头,没有宏扩展等)?

Dus*_*sty 6

我相信Coan会做你想要的.从链接:

给定一个配置和一些源代码,Coan可以回答一系列问题,如果事先已经应用了符号配置,那么源代码将如何呈现给C/C++预处理器.

并且:

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

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