Visual Studio 的 /experimental:module 与 Vulkan 的 core.h 冲突导致语法错误 - 编译失败

Visual Studio's /experimental:module conflicting with Vulkan's core.h causing syntax error - compilation failure

一点转发消息:由于我能够使用的标签数量有限,所以我选择了标签 visual-studio,尽管这至少涉及 Visual Studio 2015 个最小值一个问题,因为这更侧重于使用 Visual Studio 2017Visual Studio 2019,语言版本设置为 C++17C++20


我注意到 Visual StudioVulkan v1.1

这些版本之间存在特殊冲突

如果一个人正在构建一个基于 Vulkan 的应用程序并且他们碰巧打开了编译器标志:/std:c++latest/experimental:module

从此处找到的文档:

并尝试针对 Vulkan 库编译和/或 link 由于上述冲突,它失败了。


vulkan_core.h 出现了一个重大故障,因为他们定义的一些结构有一个名为 module 的成员,这可以从他们的规范 sheet 中看出:khronos/vulkan/specs/1.1-extensions...

Vulkan's VkPipelineShaderStageCreateInfo 结构中,他们这样定义它:

typedef struct VkPipelineShaderStageCreateInfo {
    VkStructureType                     sType;
    const void*                         pNext;
    VkPipelineShaderStageCreateFlags    flags;
    VkShaderStageFlagBits               stage;
    VkShaderModule                      module;
    const char*                         pName;
    const VkSpecializationInfo*         pSpecializationInfo;
} VkPipelineShaderStageCreateInfo;

其中包含一个名为 moduleVkShaderModule,这与 Visual Studio's /experimental:module 编译器标志冲突,因为这使 module 成为 keywordC++17 和/或 C++20 语言中。

此功能在 Visual Studio 2017Visual Studio 2019 中可用,我不是 100% 确定,但我认为它在 Visual Studio 2015 中也可用,因为我认为这是 Microsoft 推出的它。


这里有一个简短的主题、主题或讨论: https://developercommunity.visualstudio.com/content/problem/556929/enabling-modules-causes-syntax-error-in-vulkan-cor.html 他们提到正在对此进行调查,但我没有看到更多关于这个主题的信息。

我什至想先在这里搜索一下,看看有没有提到它,但我的搜索结果一无所获。所以我决定 post 这个问题更多的是作为对其他用户的认识和参考,因为我认为这是一个需要解决的重要问题,因为 Vulkan 正在成为一个流行的 3D 图形和计算 API 工具来使用。


所以对于我关于这个问题的问题:


我问了这一系列问题,以获得整个社区的总体反馈。

我还希望看到其他人对此做出贡献 post 添加 link 与此特定主题相关的其他讨论、计划和可能的解决方案,使其成为参考C++ 社区所有读者的页面!

  • 除了提到的内容之外,还有其他跟进吗?

vulkan 的 public 问题跟踪器有一个主题:https://github.com/KhronosGroup/Vulkan-Docs/issues/568

解决方案是 module 成为上下文关键字,这样编译器就不会给出错误。

  • 除了禁用 Visual Studio 编译器功能外,还有其他解决方法吗?

您可以编辑 vulkan header,成员字段的名称对于正确操作无关紧要。

  • 照顾这个的责任落到哪里去了。

Microsoft 需要修复他们的编译器。

  • 还有;模块是否会被视为标准中 C++ 语言中的实际关键字,或者这将是 Microsoft 特定的东西?

这将是一个上下文关键字。

  • gcc 或 Clang 等其他编译器是否受此影响?

如果他们正确实施上下文关键字,那么他们将不会受到影响。