如何在VS中高效地调试宏? 我在我的(非托管)C++代码中有一个非常复杂的宏。有没有办法在VS调试器中展开宏?或者也许有另一种调试宏的方法
我想在里面放一个断点如何在VS中高效地调试宏? 我在我的(非托管)C++代码中有一个非常复杂的宏。有没有办法在VS调试器中展开宏?或者也许有另一种调试宏的方法,c++,debugging,visual-studio-2008,macros,C++,Debugging,Visual Studio 2008,Macros,我想在里面放一个断点 (是的,我知道宏不好。)编译器可以很好地扩展宏。 获取已展开宏的编译列表 将展开的宏插入代码中。 重新编译,您应该能够逐步完成它, 做一个简单的测试 一般来说,当我构建一个复杂的宏时, 我先硬编码,然后测试它。 然后我把它变成一个宏 对于2008年,可能有帮助通过右键单击并转到“属性”转到项目或源文件属性。在配置属性->C/C++->预处理器下,将“生成预处理文件”设置为有行号或无行号,以您喜欢的为准。这将显示宏在上下文中展开的内容。如果您需要在实时编译代码上调试它,只需剪
(是的,我知道宏不好。)编译器可以很好地扩展宏。 获取已展开宏的编译列表 将展开的宏插入代码中。 重新编译,您应该能够逐步完成它, 做一个简单的测试 一般来说,当我构建一个复杂的宏时, 我先硬编码,然后测试它。 然后我把它变成一个宏
对于2008年,可能有帮助通过右键单击并转到“属性”转到项目或源文件属性。在配置属性->C/C++->预处理器下,将“生成预处理文件”设置为有行号或无行号,以您喜欢的为准。这将显示宏在上下文中展开的内容。如果您需要在实时编译代码上调试它,只需剪切并粘贴它,并在调试时将其放置在宏的位置
我说过宏是非常复杂的吗?我只想扩展一个或两个层,而不是所有的宏(否则它显然是不可读的)。。。调试时 如果没有太多不想扩展的宏,那么只需在要调试的代码段之前取消对它们的定义即可。然后使用上面提到的[Generate Preprocessed File]进行编译。编译将失败,但您将在预处理的输出中获得一个可用的片段,并使用正确的扩展。复制粘贴,删除#undf-s并调试 不幸的是,处理C风格宏的最好朋友是内联的,模板的,以及一个很好的优化编译器。使用内联函数(如果你真的想强制内联的话)并坚持它!这将更加高效(如果您针对perf进行了优化,那么只有内联才能带来性能)并且可以维护。通过使用宏:类型检查和安全性,您会失去很多 编译器不存在宏,它们只对预处理器存在。这一个在不寻找副作用的情况下进行文本替换。因此,宏实际上从未被调用,您无法调试到宏中。无论如何编写宏,都有可能出现误用。如本例所示:
#define SQUARE(a) ((a)*(a))
请注意,(
`)以防止替换方形(3+2)。但它们不能防止:
int a = 1;
int b = SQUARE(++a);
有人会认为它是4,但你最终得到的是6,这不是真正的正方形。当它扩展到intb=(++a)*(++a)代码>使用内联函数不会有这种问题
请注意,内联函数的实现必须在使用它的地方对编译器可见。对于新手用户来说,调试也会很奇怪:因为有许多内联函数的实例,例如,如果您想将执行点移动到另一个地方,您将得到一个巨大的方法列表。是的,您可以
在调试文件夹
中找到预处理器生成的预处理文件
因此,如果宏是在testing.c文件中编写的,则预处理的文件将称为testing.i
在那里,您可以看到宏是如何展开的
要调试它,只需将此代码复制粘贴到您的:)如果您想查看预处理器生成的扩展代码,那么您可以使用gcc使用-E标志获得它。命令如下所示:
$ gcc -E <source code> -o <preprocessed file name>
$gcc-E-o
您可以用扩展代码替换使用宏的原始源代码,并在其中放置任何断点。我从调试宏的最佳方法中学到了这一点
我要做的是创建一个名为“test.cxx”的cxx文件,在里面我只放了宏和一个test.cxx的示例:
#define GetMacro(param1) \
public: void Get##param1(){ return m_##param1; }
GetMacro(MyVariable);
在命令行中输入:
c:\ cl /EP test.cxx > output.cxx
打开output.cxx文件时,应该有一些空行,底部是展开的宏,如:
public: void GetMyVariable(){ return m_MyVariable; };
您可以不用编译就测试宏,这使测试变得很快。我听到了关于这个主题的所有可能的否定答案:
- 宏只能展开,不能计算
- 预处理器还应该解析包含文件的文件
- 嵌套宏可能过于复杂
- 条件预处理可能很棘手
- 宏是邪恶的,只要避开它们
- 等等等等
>是的,从实际意义上讲,是可能的。
< P>如果你使用VisualStudio来处理使用宏的C++或C++项目,请获取(我相信有试用版)。它允许您单击宏并将其完全展开或分阶段展开。我们有一些非常复杂的嵌套宏,这是理解它们的唯一方法。我真的找不到如何自动展开宏。我知道我可以手动完成,但我希望IDE可以做到。。。与GDB的expand命令类似。您可以在源文件上运行C预处理器,以扩展所有宏。单独运行预处理器时,请注意,它可能对预定义的宏/常量(特别是平台/编译器版本特定的宏/常量)有不同的理解。我被这个咬了@j、 因此,为什么只需从编译列表中提取它。这避免了你的问题。我说过宏非常复杂吗?我只想扩展一个或两个层,而不是所有的宏(否则它显然是未读的)