簡體   English   中英

VS2019:編譯 Cap'nProto 使 C++ 編譯器崩潰

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM