[英]VS2019: Compiling Cap'nProto Crashes C++ Compiler
因此,情况是,由于一些不可预见的后果,我需要使用 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 = &kj_switch_done
行中,但它仍然会导致编译器崩溃)。
有任何想法吗?
这是KJ_CASE_ONEOF()中围绕 VS2019 ICE 的一项工作,现在正在进行代码审查,希望很快将合并到 master
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.