扩展宏进行调试?
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 块可以工作,但不能进行宏扩展