避免错误包含相同文件的最佳方法是啥?
Posted
技术标签:
【中文标题】避免错误包含相同文件的最佳方法是啥?【英文标题】:What is the best way to avoid missincluding same files?避免错误包含相同文件的最佳方法是什么? 【发布时间】:2019-09-14 14:25:31 【问题描述】:给定文件树:
DLL1
└───source
├───File1.h
└───SameHeader.h
DLL2
└───source
├───File2.h
└───SameHeader.h
File1 包含 SameHeader.h,这很好。 File2 包含无法编译的 File1,因为 #include "SameHeader.h" 现在指向 DLL2/source/SameHeader.h。有没有办法确保 File1 使用同一个 dll 中的文件?
【问题讨论】:
当然:对两个头文件使用不同的名称。问题解决了。 这似乎是一种解决方法,而不是解决方案。 @rustyx -- 没有这样的要求,不同的编译器做的也不同。对于某些人来说,#include "SameHeader.h"
会首先查看正在编译的 源文件 的目录;对于其他人,它首先在当前文件的目录中查找,就像这里一样,它可能是“File1.h”或“File2.h”。但这些都不是必需的;正式地,搜索的地方是由实现定义的。
@Adrian -- 虽然不是 100% 清楚,但在我看来,名为“SameHeader.h”的两个标题并不相同,只是名称相同。如果它们相同,则问题中描述的问题不会发生。
@Adrian -- 你的答案只有一个名为“SameHeader.h”的文件。
【参考方案1】:
当然 - 您可以将文件 SameHeader.h
放在单独的文件夹中(与源文件不同),然后在要搜索的包含路径列表中指定该文件夹(在项目选项或编译器命令中)开关)。
当然,您需要从每个源项目目录中删除文件SameHeader.h
,或者优先使用该文件而不是单独文件夹中的文件。
因此,使用您的“文件树”图,我建议这样做:
DLL1
└───source
├───File1.h
DLL2
└───source
├───File2.h
Include
└───SameHeader.h
然后您可以将../Include
添加到编译器的包含文件搜索路径中。如何做到这一点取决于您的编译器和/或环境,但这将类似于 MSVC 中的/I"..\_Include"
开关或(可能)带有clang 的-I"../_Include"
。这就是我在多项目解决方案中所做的,适用于将由多个项目使用的所有头文件。
但是,如果您确实需要两个(不同的)SameHeader.h
文件,那么您或许应该在 File1 的 #include "SameHeader.h"
行中指定完整路径名(或者至少是限定路径) - 类似于:@ 987654329@(取决于您的文件和文件夹的确切布局)。
【讨论】:
如果两个“SameHeader.h”文件的内容相同,则不会出现问题中引用的问题。所以它们一定是不同的,不能只复制其中一个而删除另一个。 内容不同,我不复制文件。我认为没有办法实现我想要的,除非我将它包含在完整路径中(我想避免的路径)。感谢您花时间解决我的问题。 @user12067300 啊!抱歉,我的最新编辑是在您发表评论之前发布的!我会回到它。但也许您应该考虑拆分每个SameHeader.h
的内容,以便两个 DLL 需要 common 的位位于单独的标头中,而 特定的位 每个都在各自的标题中。以上是关于避免错误包含相同文件的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
解决 terraform 中 EntityAlreadyExists 错误的最佳方法是啥?