【问题标题】:VS2019: Compiling Cap'nProto Crashes C++ CompilerVS2019:编译 Cap'nProto 使 C++ 编译器崩溃
【发布时间】:2020-09-16 08:54:39
【问题描述】:

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

从下面的屏幕截图中可以看出,编译器对代码非常不满意,以至于它在第 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 = &amp;kj_switch_done 行中添加更多变量,但它仍然会导致编译器崩溃。

有什么想法吗?

【问题讨论】:

  • “内部编译器错误”是编译器中的错误。您应该向编译器供应商报告。
  • 做到了,但是推出具有此特定修复程序的新版本需要时间。
  • 也尝试将问题报告给 capnproto 项目。
  • 也做到了! :)

标签: c++ compiler-errors crash visual-studio-2019 capnproto


【解决方案1】:

这是一个Work around VS2019 ICE in KJ_CASE_ONEOF(),现在正在代码审查中,希望很快能合并到master中

【讨论】:

    猜你喜欢
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 2014-09-08
    • 2011-05-08
    • 2012-02-02
    • 1970-01-01
    • 2012-07-10
    • 1970-01-01
    相关资源
    最近更新 更多