【发布时间】:2025-12-17 12:35:01
【问题描述】:
在我的情况下的具体细节:我正在使用带有AMD's vulkan memory allocator 的 MSVC,这是一个 stb 样式的单个头文件。 (所以你把它包括在你的项目中,比如:
#define VMA_IMPLEMENTATION
#include "vk_mem_alloc.h"
在单个编译单元内编译它,并且只是
#include "vk_mem_alloc.h"
在任何需要使用它的文件中。)
无论如何:
我遇到的一些具体错误示例如下:
“VmaDeviceMemoryBlock *”类型的参数与“VmaDeviceMemoryBlock *”类型的参数不兼容
和
“VmaSuballocationType”类型的值不能分配给“VmaSuballocationType”类型的实体
和
声明与“void VmaBlockMetadata::PrintDetailedMap_Allocation(VmaJsonWriter &json, VkDeviceSize offset, VmaAllocation hAllocation) const”不兼容
当定义是
void VmaBlockMetadata::PrintDetailedMap_Allocation(class VmaJsonWriter& json,
VkDeviceSize offset,
VmaAllocation hAllocation) const
这些错误,以及许多其他没有明显损坏的错误,绝对会乱扔文件。更奇怪的是,我可以构建程序,它可以毫无问题地编译和运行。它用这种噪音填充我的错误窗口完全破坏了错误窗口的有用性。现在我的代码中还出现了其他奇怪的错误,我不确定如何继续。
【问题讨论】:
-
我不熟悉那个特定的库,但我想知道在 include 之前包含(或不包含)那个宏是否会以某种方式破坏单一定义规则?并试图导致两种不同的类型具有相同的名称?虽然如果是这种情况,我预计会出现不同的编译错误。
-
您能否发布或链接完整的错误输出,或许还有一个演示问题的示例源文件(即minimal reproducible example)?
-
我不相信——这类文件本质上是
library.h >> #ifdef LIBRARY_IMPLEMENTATION >> library.c >> #endif,所以定义(“在隐喻的c文件中”)只能从#defined LIBRARY_IMPLEMENTATION之前的单个编译单元中看到包括它。 (我已经仔细检查过我已经这样做了) -
我在一个没有问题的大型项目中使用 VMA 和 MSVC(来自 VMA。)而且由于您似乎正确处理了最普遍的奇怪错误情况(#defining the IMPL macro in more地方多于一个,)我有两个问题(但我不希望任何一个都会导致任何事情。) 1:你确定你已经在源文件(不是头文件)中#defined IMPL 宏,并且 在所有其他#includes之后?和 2:你确定你没有循环包含、统一构建或其他会导致循环包含的奇怪设置吗?
-
如果程序编译成功,那就是 IDE 问题。
标签: c++ visual-c++ visual-studio-2019 amd vulkan