【问题标题】:Visual Studio nested macro/template classes debugging aidVisual Studio 嵌套宏/模板类调试帮助
【发布时间】:2021-01-23 04:22:41
【问题描述】:

我尝试使用 Visual Studio 2019 在 Windows 中构建 Goptical 包 (https://savannah.gnu.org/projects/goptical)。它使用 DPP 库 (https://code.ssji.net/hg/),在 Visual Studio 下构建时会引发错误。使用 gcc 的 Linux 构建按预期顺利进行,但我需要在带有 Visual Studio 的 Windows 上使用它。

错误来自委托类,这些委托类是使用宏进一步包裹的嵌套模板类。尝试调试,但 Visual Studio 似乎无法查明错误的确切位置,而是指向触发错误的最后一行。

是否有任何机制可以让我们看到宏定义逐步回滚?或者,我们可以检查以逐步调试此中间输出?在下面发布违规代码和错误详细信息:

1> delegate(578,1): error C2059: syntax error: ','
1> delegate(578): message : see reference to class template instantiation 'dpp::delegate_bind<base,R(void),3>' being compiled

代码:

#if DPP_DELEGATE_ARGC >= 2
  _DPP_DELEGATE(2)
  _DPP_DELEGATE_FUNC(2)
  _DPP_DELEGATE_MEMBER(2)
  _DPP_DELEGATE_MEMBER_THIS(2)
  _DPP_DELEGATE_BIND(1, 1, 1, _DPP_DELEGATE_BTDEFS(1, 0), _a0, a0);
  _DPP_DELEGATE_BIND(2, 1, 1, _DPP_DELEGATE_BTDEFS(1, 1), a0, _a0);
  _DPP_DELEGATE_BIND(3, 0, 2, _DPP_DELEGATE_BTDEFS(2, 0, 1), _a0, _a1);
#endif

【问题讨论】:

  • 我经常发现对宏问题有帮助的方法是进入 C/C++ -> 预处理器页面上的项目属性并将“预处理到文件”设置为是。然后我可以检查编译器尝试使用的实际代码。
  • 可变参数宏在 MSVC 和 gcc/clang 之间的处理方式不同,这总是会导致某些预处理器元编程库中的错误。但可悲的是,似乎没有什么可以让 MSVC 做与 gcc/clang 一样的事情。所以作者总是应该在 MSVC 中提供不同的实现,就像 boost 所做的那样。

标签: c++ visual-studio templates macros


【解决方案1】:

我建议你可以在Properties-&gt;C/C++-&gt;Preprocessor-&gt;Preprocess to file 中设置Yes。然后,您可以在项目的调试目录中看到XXX.i 文件中的宏定义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-23
    • 2015-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多