VS2019:编译 Cap'nProto 导致 C++ 编译器崩溃

VS2019: Compiling Cap'nProto Crashes C++ Compiler

因此,情况是由于一些不可预见的后果,我需要使用 Visual Studio 2019(据我所知是最新版本)为 windows 构建 Cap'nProto (https://capnproto.org/)知道,16.7.3).

正如您从下面的屏幕截图中看到的那样,编译器对代码非常不满意,以至于它在第 2616 行给出了一个内部编译器错误,其中有一个非常复杂的宏可以扩展为自动模板噩梦。

宏本身是:

#define KJ_CASE_ONEOF(name, ...) \
    break; \
  case ::kj::Decay<decltype(*_kj_switch_subject)>::template tagFor<__VA_ARGS__>(): \
    for (auto& name = _kj_switch_subject->template get<__VA_ARGS__>(), *_kj_switch_done = &name; \
         _kj_switch_done; _kj_switch_done = nullptr)

我的第一次尝试是手动修复此事件(以及此文件中的下一个事件,其中包括提取 for 外部的两个变量定义,并添加一对额外的作用域(不触及宏实际上)但下一个编译阶段显示,遗憾的是这个宏在应用程序中到处都在使用。顺便说一句,这个策略奏效了,编译器不再崩溃了。

但是由于那个战略性的恶意破坏,(很容易)按照上述策略重写宏被证明比我想象的要难一些。

现在,我可以报告错误并等待 Microsoft 修复其编译器,但是考虑到我需要这个已编译的...昨天这不是现在的选项。

他们网站上的 Capnproto (https://capnproto.org/install.html#supported-compilers) 声称他们支持 Visual Studio 2017,遗憾的是这对我来说也不是一个选择。

我选择的另一个解决方案是询问社区是否有人对如何重写该宏有任何其他想法,以便稍微扰乱宏生成的代码,同时它仍然具有相同的含义,只是表达方式不同(我尝试在 **dummy = &kj_switch_done 行中添加更多变量,但它仍然会导致编译器崩溃)。

有什么想法吗?

这是一个Work around VS2019 ICE in KJ_CASE_ONEOF(),目前正在进行代码审查,希望很快会合并到 master