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

时间:2019-09-13 10:21:27

标签: visual-studio module c++17 vulkan c++20

一条前瞻性消息:由于我只能使用标签数量,因此我选择了标签visual-studio,尽管这至少与Visual Studio 2015最小值有关,这无关紧要因为这更着重于使用Visual Studio 2017Visual Studio 2019语言版本的C++17C++20


我注意到Visual StudioVulkan v1.1的这些版本之间存在特殊的冲突

如果正在构建基于Vulkan的应用程序,而它们恰巧打开了编译器标志:/std:c++latest/experimental:module

文档可从此处找到:

并尝试针对Vulkan库进行编译和/或链接,该库由于上述冲突而失败。


vulkan_core.h产生了重大故障,因为它们的某些已定义结构具有名为module的成员,可以从其规格表中看到: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;

包含名为VkShaderModule的{​​{1}},并且与module Visual Studio's编译器标志冲突,因为这使/experimental:module成为module keyword和/或C++17语言。

此功能在C++20Visual Studio 2017中可用,我不确定100%,但我认为Visual Studio 2019中也可用,因为我认为这是Microsoft引入它时。


这里有一个简短的主题,主题或讨论: https://developercommunity.visualstudio.com/content/problem/556929/enabling-modules-causes-syntax-error-in-vulkan-cor.html他们提到正在对此进行调查,但是在这个主题上我所看到的并不比我发现的更多。

我什至试图先在这里搜索,看看是否有提及,但搜索结果毫无结果。因此,我决定将此问题发布为更多的了解和参考其他用户的方式,因为我认为这是一个重要的问题,因为Visual Studio 2015已成为一种流行的3D图形和Compute API工具。


关于这个问题,我的问题是

  • 除了提到的内容以外,还有其他后续活动吗?
  • Vulkan编译器功能以外,是否还有其他解决方法?
  • 照顾这个问题的责任归结为:disabling库的负责人Visual StudioThe Khronos GroupLunarG,因为他们正在将此功能添加到他们的Vulkan还是会涉及到实际的Microsoft
  • 也;是将compiler视为标准中C++ Standard语言中的实际module还是这是Microsoft特定的事情?
  • 这会影响其他key wordC++之类的编译器吗?

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

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

1 个答案:

答案 0 :(得分:4)

  • 除了提到的内容以外,还有其他后续活动吗?

vulkan的公共发行跟踪器上有一个主题:https://github.com/KhronosGroup/Vulkan-Docs/issues/568

解决方案是module将成为上下文关键字,因此编译器不应在其上给出错误。

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

您可以编辑vulkan标头,成员字段的名称与正确操作无关紧要。

  • 照顾这个问题的责任将落在哪里。

Microsoft需要修复其编译器。

  • 也;是模块将被视为标准中C ++语言中的实际关键字,还是微软特定的东西?

它将是上下文关键字。

  • 这会影响gcc或Clang等其他编译器吗?

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