扩展宏进行调试?

Posted

技术标签:

【中文标题】扩展宏进行调试?【英文标题】:Expanding macros for debugging? 【发布时间】:2018-05-04 16:12:29 【问题描述】:

我是使用宏函数的新手,我知道在操作顺序方面它们的使用存在一些缺陷。有没有办法在预处理器通过后扩展宏,以便我可以看到它的样子?

在 VS2017 中,我尝试了处理器 > C/C++ > 预处理器 > 预处理到一个文件,该文件创建了一个 *.i 文件,但它大约有 50k 行长,我似乎无法找到我的宏扩展到的位置。

编辑:我知道宏是坏消息,但是,我正在进入的代码库使用它们相当多,所以我试图更好地理解它们。

【问题讨论】:

如果你展开宏,你会看到很多代码——这是你不应该使用宏的众多原因之一,至少在 C++ 中是这样。 明白了 - 不幸的是,我进入的代码库使用了它们,所以我试图弄清楚如何理解它们。 如果您使用的是IDE,例如 eclipse,您只需将鼠标悬停在宏上,它就会在弹出窗口中展开。 创建.i 文件的选项可能是您将获得的最佳选择。但是:搜索是你的朋友!将文件读入一个好的文本编辑器,并搜索一些你知道在你感兴趣的宏扩展附近的关键字或函数调用,你应该能够找到它。 “我刚开始使用宏函数” - 那么现在就学习这个:不要使用宏(除了在极少数情况下他们真的/不幸的是,这是唯一的选择)。 【参考方案1】:

在 VS2017 中,我尝试了 Processor > C/C++ > Preprocessor > Preprocess 到一个创建 *.i 文件的文件,但它的长度约为 50k 行,我似乎无法找到我的宏扩展的位置。

您可以通过在使用宏的行之前声明一个虚拟变量来帮助自己。

例如

extern int dummyIntVariable;
MY_COMPLICATED_MACRO(arg1, arg2);

之后,您在 .i 文件中查找 dummyIntVariable。它下面的行将包含 MY_COMPLICATED_MACRO 扩展为的内容。

或者正如@Sneftel 在评论中指出的那样,您可以使用任何旧字符串来帮助您浏览 .i 文件。

THIS IS A UNIQUE STRING
MY_COMPLICATED_MACRO(arg1, arg2);

由于文件只是经过预处理,所以应该也可以。

【讨论】:

如果你只是预处理,你甚至不必声明虚拟变量。 @Sneftel,虚拟变量对于浏览 OP 在 .i 文件中看到的 50k 行很有用。 不,我的意思是,代码不需要编译,只需预处理。你可以输入THIS IS A UNIQUE STRING,然后grep。 @Sneftel,我明白了。是的,这也是一种选择。

以上是关于扩展宏进行调试?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Boost/Wave C/C++ 预处理器的选择性宏扩展

带有外部绑定符号的 core.async go 块可以工作,但不能进行宏扩展

这些宏和 typedef 有啥作用?如何将其扩展到成员函数?

检查C代码时cppcheck不扩展宏?

用于在宏扩展期间跟踪 C 预处理器执行的工具?

无法在宏中使用 self,因为宏扩展忽略标记“self”