gpt4 book ai didi

c-preprocessor - 分离特定的#ifdef 分支

转载 作者:行者123 更新时间:2023-12-04 06:40:25 31 4
gpt4 key购买 nike

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

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

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

嗯,差不多。

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

#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 到 的任何位置两百行 (你会认为最后一个可以通过切换头文件来完成,但函数名称需要相同)。

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

有什么东西可以生成我需要的两种不同的源树,仅基于 PRODUCT_A正在定义和 PRODUCT_B未定义(反之亦然), 没有 触及其他任何东西(即没有标题包含,没有宏扩展等)?

最佳答案

我相信Coan会做你正在寻找的。从链接:

Given a configuration and some source code, Coan can answer a range of questions about how the source code would appear to the C/C++ preprocessor if that configuration of symbols had been applied in advance.



并且:

Source code re-written by Coan is not preprocessed code as produced by the C preprocessor. It still contains comments, macro-invocations, and #-directives. It is still source code, but simplified in accordance with the chosen configuration.



所以你可以运行它两次,首先指定产品 A,然后指定产品 B。

关于c-preprocessor - 分离特定的#ifdef 分支,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2786000/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com