加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 如何使用gcc / g预处理器去除非活动的#if指令?

发布时间:2020-12-16 09:53:39 所属栏目:百科 来源:网络整理
导读:我正在使用第三方开源项目,需要删除不活动的#ifs,#ifdefs等,以便更好地理解代码流. 有没有办法使用make来生成没有这些指令的源文件版本?我想避免扩展宏,只需删除指令. 我在看 https://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html 似乎-dD和-fdir
我正在使用第三方开源项目,需要删除不活动的#ifs,#ifdefs等,以便更好地理解代码流.

有没有办法使用make来生成没有这些指令的源文件版本?我想避免扩展宏,只需删除指令.

我在看
https://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html

似乎-dD和-fdirectives只是开始的好选择.

这些预处理文件将出现在哪里?我在哪里添加这些命令以用于Makefile和“make”?
我尝试运行“make -n”来生成脚本并在-Wformat之后在脚本中添加g和gcc调用选项,但我没有注意到任何事情.

我不确定这是否复杂,但我也使用avr-gcc和avr-g.

我看过coan,它不支持#included #defines所以它不能用于此目的,我无法让sunifdef工作.是否有一种方法可以使用预处理器执行此操作.

定义分散在当前文件,包含的文件和包含指定-Dfoo = opt选项的makefile之间.

解决方法

您可以使用预处理器选项走上正轨. -D将定义一个值为1的宏,-U将取消任何先前的定义(它将变为未定义),-fdirectives-only将禁止宏扩展.除此之外,您可以将-E标志与gcc一起使用,以告诉它将预处理器输出作为单独的文件提供给您进行检查.但是,我认为它们不会像你期望的那样. CPP(C预处理器)输出可能会添加其他内容,如 this SO question所示,您应该检查gnu CPP output manual page.这是您将从CPP获得的内容.

听起来你想要能够剥离这个无关的代码并从那里开发.要做到这一点,我会鼓励你再试一次unifdef.这就是unifdef的目的,而CPP旨在为编译准备代码.它们是不同的任务,因此您应该使用正确的工具.它在http://dotat.at/prog/unifdef/作为独立应用程序提供,并在Linux Shells中构建.

它允许您指定希望它定义或未定义的宏,并删除条件指令评估为false的代码块.例如,您可以像这样运行它:

unifdef -I<路径> -DMACRO1 -UMACRO2

它将搜索<指定的目录.路径>通过C/C++源文件,查找#if,#ifdef,#ifnf等.遇到它们时,它将评估条件表达式并有选择地删除该表达式控制的代码.考虑使用此代码的输入文件:

int i = 0;
#ifdef MACRO1
int j = 0;
#endif /* ifdef MACRO1 */
int k = 0;

int m = 0;
#if (MACRO1 && MACRO2)
int n = 0;
#endif /* if (MACRO1 && MACRO2) */
int p = 0;

int q = 0;
#ifdef MACRO3
int r = 0;
#endif /* ifdef MACRO3 */
int t = 0;

如果我们像上面的例子一样调用unifdef,输出将是这样的:

int i = 0;
int j = 0;
int k = 0;

int m = 0;
int p = 0;

int q = 0;
#ifdef MACRO3
int r = 0;
#endif /* ifdef MACRO3 */
int t = 0;

请注意,n的声明已被删除,因为它包含在预处理器#if / #endif块中,其控制表达式的计算结果为false(我们告诉unifdef将MACRO2视为未定义). j的声明仍然存在,但#ifdef和#endif语句被删除,因为已知控制表达式为真.

取决于MACRO3的块保持不变,因为其状态未知.

对于其运行方式,还有很大的灵活性和控制力.

如果您确定要将其作为构建过程的一部分,则可以始终将其添加到makefile中.

如果您没有可以定义或未定义的宏的列表,您可以使用unifdef提供的“unifdefall”脚本,它将使用CPP自己发现源代码中的宏定义,并删除/保留代码块根据源代码中包含的定义.

TL; DR

是的,你可以(有点)用预处理器来做.但unifdef和sunifdef是完成这个的工具,所以你应该使用它们.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读