如何使用gcc / g ++预处理程序去除无效的#if指令?

用户名

我正在使用第三方开放源代码项目,需要删除不活动的#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中。

Skrrgwasme

您的预处理器选项在正确的轨道上。-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自行在源代码中发现宏定义,并删除/保留根据源代码中包含的定义的代码块。

TL; DR

是的,您可以(某种程度上)使用预处理器来完成此操作。但是unifdef和sunifdef是专门用于实现此目的的工具,因此应改用它们。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用gcc / g ++预处理程序去除无效的#if指令?

来自分类Dev

使用#undef预处理程序指令

来自分类Dev

预处理程序如何处理“ #include”指令?

来自分类Dev

如何从预处理程序#if指令调用constexpr函数?

来自分类Dev

使用预处理程序指令生成成员名称?

来自分类Dev

使用__LINE__的C:宏中的预处理程序指令

来自分类Dev

使用clang或g ++ / gcc来打印预处理的代码,而不包含系统路径中的文件

来自分类Dev

如何去除g

来自分类Dev

使用cordova VS工具如何添加预处理程序指令,例如“ DISABLE_PUSH_NOTIFICATIONS”

来自分类Dev

使用-g gcc标志编译的程序是否比不使用-g编译的程序慢?

来自分类Dev

使用-g gcc标志编译的程序是否比不使用-g编译的程序慢?

来自分类Dev

为什么该程序使用gcc而不是g ++进行编译?

来自分类Dev

如何使用gcc预处理和编译程序集文件(.s)?

来自分类Dev

如何使用gcc预处理程序在标准库中查找定义?

来自分类Dev

如何仅将C预处理程序应用于某些(#if /#endif)指令?

来自分类Dev

如何仅将C预处理程序应用于某些(#if /#endif)指令?

来自分类Dev

如何在gcc程序集中启用预处理器

来自分类Dev

如何关闭Linux上的gcc预处理程序?

来自分类Dev

如何关闭Linux上的gcc预处理程序?

来自分类Dev

如何在gcc程序集中启用预处理器

来自分类Dev

我可以在.ld文件中使用预处理程序指令吗

来自分类Dev

使用预处理程序指令定义美元符号表示的内容是否会引起冲突?

来自分类Dev

XCode 6预处理程序指令(#ifndef)不起作用,不能使用嵌套标头

来自分类Dev

使用Visual Studio上的预处理程序指令识别当前配置吗?

来自分类Dev

如何使gcc跳过预处理?

来自分类Dev

何时对GCC使用-g标志

来自分类Dev

使g ++使用SHLD / SHRD指令

来自分类Dev

使用GCC对C文件进行部分预处理(不删除“ define”指令)

来自分类Dev

我可以在Inno Setup中使用带有预处理程序指令的消息使用.isl文件吗?

Related 相关文章

  1. 1

    如何使用gcc / g ++预处理程序去除无效的#if指令?

  2. 2

    使用#undef预处理程序指令

  3. 3

    预处理程序如何处理“ #include”指令?

  4. 4

    如何从预处理程序#if指令调用constexpr函数?

  5. 5

    使用预处理程序指令生成成员名称?

  6. 6

    使用__LINE__的C:宏中的预处理程序指令

  7. 7

    使用clang或g ++ / gcc来打印预处理的代码,而不包含系统路径中的文件

  8. 8

    如何去除g

  9. 9

    使用cordova VS工具如何添加预处理程序指令,例如“ DISABLE_PUSH_NOTIFICATIONS”

  10. 10

    使用-g gcc标志编译的程序是否比不使用-g编译的程序慢?

  11. 11

    使用-g gcc标志编译的程序是否比不使用-g编译的程序慢?

  12. 12

    为什么该程序使用gcc而不是g ++进行编译?

  13. 13

    如何使用gcc预处理和编译程序集文件(.s)?

  14. 14

    如何使用gcc预处理程序在标准库中查找定义?

  15. 15

    如何仅将C预处理程序应用于某些(#if /#endif)指令?

  16. 16

    如何仅将C预处理程序应用于某些(#if /#endif)指令?

  17. 17

    如何在gcc程序集中启用预处理器

  18. 18

    如何关闭Linux上的gcc预处理程序?

  19. 19

    如何关闭Linux上的gcc预处理程序?

  20. 20

    如何在gcc程序集中启用预处理器

  21. 21

    我可以在.ld文件中使用预处理程序指令吗

  22. 22

    使用预处理程序指令定义美元符号表示的内容是否会引起冲突?

  23. 23

    XCode 6预处理程序指令(#ifndef)不起作用,不能使用嵌套标头

  24. 24

    使用Visual Studio上的预处理程序指令识别当前配置吗?

  25. 25

    如何使gcc跳过预处理?

  26. 26

    何时对GCC使用-g标志

  27. 27

    使g ++使用SHLD / SHRD指令

  28. 28

    使用GCC对C文件进行部分预处理(不删除“ define”指令)

  29. 29

    我可以在Inno Setup中使用带有预处理程序指令的消息使用.isl文件吗?

热门标签

归档