【发布时间】: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