我正在使用第三方开放源代码项目,需要删除不活动的#ifs,#ifdefs等以更好地理解代码流。
没有这些指令,是否可以使用make来生成源文件的版本?我想避免扩展宏,只需删除指令即可。
我在看https://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html
似乎-dD和-fdirectives-only是很好的启动选项。
这些经过预处理的文件将出现在哪里?我在哪里添加这些命令以与Makefile和“ make”一起使用?我尝试运行“ make -n”来生成脚本,并在-Wformat之后在脚本中向g ++和gcc调用添加选项,但是我什么都没注意到。
我不确定这是否会使任何事情复杂化,但是我也在使用avr-gcc和avr-g ++。
我已经研究过coan,它不支持#included#defines,因此不能用于此目的,并且无法使sunifdef正常工作。有没有办法用预处理器做到这一点。
定义分散在当前文件,包括的文件以及指定-Dfoo = opt选项的包括的makefile中。
您的预处理器选项在正确的轨道上。-D将定义值为1的宏-U将取消任何先前的定义(它将变为未定义),并且-fdirectives-only将禁止宏扩展。除此之外,还可以在gcc中使用-E标志,以告知其将预处理器输出作为单独的文件提供给您进行检查。但是,我认为它们不会达到您的期望。正如这个SO问题所建议的那样,CPP(C预处理器)输出中可能还添加了其他内容,因此您应该查看gnu CPP输出手册页。那就是您将从CPP中获得的收益。
听起来您好像希望能够一次剥离这些多余的代码并从那里进行开发。为此,我鼓励您再次尝试unifdef。这是unifdef的目的,而CPP的目的是准备要编译的代码。它们是不同的任务,因此您应该为它们使用正确的工具。它可以作为独立的应用程序从http://dotat.at/prog/unifdef/获得,并内置于某些Linux Shell中。
它允许您指定要让其考虑已定义或未定义的宏,并删除条件指令将其评估为false的代码块。例如,您可以这样运行它:
unifdef -I <路径> -DMACRO1 -UMACRO2
这将通过<路径>通过C / C ++源文件,寻找指定的目录中搜索#if
,#ifdef
,#ifndef
等。当它遇到它们,将评估条件表达式和选择性地除去由该表达控制的代码。考虑具有以下代码的输入文件:
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
语句被删除,因为已知控制表达式为true。
依赖于MACRO3的块保持不变,因为其状态未知。
同样,它的运行方式也具有很大的灵活性和控制力。
如果你决定做希望它是构建过程的一部分,你可以随时把它添加到你的makefile。
如果没有应定义或未定义的宏的列表,则可以使用unifdef随附的“ unifdefall”脚本,它将使用CPP自行在源代码中发现宏定义,并删除/保留根据源代码中包含的定义的代码块。
是的,您可以(某种程度上)使用预处理器来完成此操作。但是unifdef和sunifdef是专门用于实现此目的的工具,因此应改用它们。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句