如何在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; };

您可以不用编译就测试宏,这使测试变得很快。

我听到了关于这个主题的所有可能的否定答案:

  • 宏只能展开,不能计算
  • 预处理器还应该解析包含文件的文件
  • 嵌套宏可能过于复杂
  • 条件预处理可能很棘手
  • 宏是邪恶的,只要避开它们
  • 等等等等
它们都是真的,但在我看来,它们与日常编程的现实相冲突

事实上,在旧的C项目中,宏大多只是用作函数,这对我来说至关重要。使用/P生成所有预处理的文件是可行的,但会造成过度浪费和时间。我只需要一个工具来扩展一个简单的宏,该宏定义在其他文件的上面几行或最多几行

怎么做

  • 在Linux上,只需使用GDB和他的扩展宏功能
  • 在windows上,我使用集成的 进入VisualStudio

  • >是的,从实际意义上讲,是可能的。

    < P>如果你使用VisualStudio来处理使用宏的C++或C++项目,请获取(我相信有试用版)。它允许您单击宏并将其完全展开或分阶段展开。我们有一些非常复杂的嵌套宏,这是理解它们的唯一方法。

    我真的找不到如何自动展开宏。我知道我可以手动完成,但我希望IDE可以做到。。。与GDB的expand命令类似。您可以在源文件上运行C预处理器,以扩展所有宏。单独运行预处理器时,请注意,它可能对预定义的宏/常量(特别是平台/编译器版本特定的宏/常量)有不同的理解。我被这个咬了@j、 因此,为什么只需从编译列表中提取它。这避免了你的问题。我说过宏非常复杂吗?我只想扩展一个或两个层,而不是所有的宏(否则它显然是未读的)