重新排序包含目录如何解决宏重新定义问题?

Posted

技术标签:

【中文标题】重新排序包含目录如何解决宏重新定义问题?【英文标题】:How reordering include directories solves macro redefinition issue? 【发布时间】:2014-12-12 22:55:34 【问题描述】:

我知道有很多关于宏重新定义问题的帖子,但我仍然无法理解重新排序如何解决问题。

当我的项目在VC++ Directories->Include Directories 中按此顺序包含时,如here 中所示 并在C/C++ -> General -> Additional Include Directories 中显示here 我收到macro redefinition 警告:

1>c:***************************************\directx\dxgitype.h(12): warning C4005: 'DXGI_STATUS_OCCLUDED' : macro redefinition (############.cpp)
1>          C:\Program Files (x86)\Windows Kits\8.0\Include\shared\winerror.h(49449) : see previous definition of 'DXGI_STATUS_OCCLUDED'

但是,当我从 Additional Include Directories 中删除 $(SolutionDir)\common\ExternalLibs\directx 并将其移动到 VC++ Directories->Include Directories 时,警告就会消失。

我检查了winerror.hdxgitype.h,但没有看到#undef DXGI_STATUS_OCCLUDED。那么,重新排序如何修复警告?至少一个标头应该有#undef,以便允许在其他标头中定义它,对吧?另外,Additional Include Directories 是在 Include Directories 之后加载的还是什么?

【问题讨论】:

不要包含指向包含您的问题的相关信息的图像的链接,如果它最终变成死链接(这很常见),它对其他社区成员毫无用处。 编辑您的帖子并将其包含在其中。 @CaptainObvlious,首先我不能在这里发布图片。当我尝试系统时说我需要超过 10 的声望才能发布图片!其次,链接没有死!那么,你为什么投了反对票?? 然后复制并粘贴包含目录配置字段的内容,并说明它们是什么以及它们来自哪些字段。 FWIW 您提供的图像不完整,并且未显示在 Visual Studio 中配置的所有包含目录。 【参考方案1】:

$(SolutionDir)\common\ExternalLibs\directx 中有什么内容?我怀疑它有一个旧版 DirectX SDK 标头的副本,这意味着您将旧的 DirectX SDK 标头与新的 Windows 8.0 SDK 标头混合在一起。 MSDN 上特别提到了您看到的错误:

c。删除项目中对 DXGIType.h 的所有引用。 Windows SDK中不存在该头文件,并且DirectX SDK版本与新的winerror.h冲突。

理想情况下,您应该停止使用旧版 DirectX SDK,如果您删除该文件夹并且它仍然可以构建,那么您应该这样做。

否则,MSDN 涵盖了将旧版 DirectX SDK 与 Windows 8.x SDK 混合使用的内容。基本上,您必须将 DirectX SDK 包含/lib 路径放在 Windows 8.x SDK 包含/lib 路径之后。

请参阅 Where is the DirectX SDK 博客文章。

【讨论】:

以上是关于重新排序包含目录如何解决宏重新定义问题?的主要内容,如果未能解决你的问题,请参考以下文章

如何在发布模式下使用宏重新定义函数?

如何解决glm标签重新定义错误[关闭]

如何使用 powershell 重新排序 CSV 列

调整屏幕大小时如何重新排序弹性项目?

代码中,使用__DATE__宏,获取程序编译时间,如何保证每次编译代码(非重新生成方式),都能更新__DATE__的值?

如何使列表视图构建器在颤振中成为可重新排序的列表视图(优先任务应用程序(待办事项应用程序))