C 是否有一种方法可以检测文件依赖关系是否为;意外地;满意的?
假设有三个头C 是否有一种方法可以检测文件依赖关系是否为;意外地;满意的?,c,header,include,C,Header,Include,假设有三个头AAA.h,BBB.h和MyLib.hMyLib.h需要同时包含AAA.h和BBB.h才能正常工作 现在,正好BBB.h中也包含AAA.h,但这完全是由于实现的缘故,MyLib.h不需要关心的细节 然而,由于错误,MyLib.h的作者忽略了包含AAA.h而从未注意到。就我所知,这通常不会导致错误或警告。后来,有人更改了BBB.h的实现细节,这样就不再需要AAA.h,从而将其删除。现在MyLib无法编译,因为库BBB的内部结构已经更改 在这样的情况下,有没有办法出错或发出警告?我怀疑(
AAA.h
,BBB.h
和MyLib.h
MyLib.h
需要同时包含AAA.h
和BBB.h
才能正常工作
现在,正好BBB.h
中也包含AAA.h
,但这完全是由于实现的缘故,MyLib.h
不需要关心的细节
然而,由于错误,MyLib.h
的作者忽略了包含AAA.h
而从未注意到。就我所知,这通常不会导致错误或警告。后来,有人更改了BBB.h
的实现细节,这样就不再需要AAA.h
,从而将其删除。现在MyLib无法编译,因为库BBB的内部结构已经更改
在这样的情况下,有没有办法出错或发出警告?我怀疑(如果这是可能的话)在包含的标题中需要某种注释 您正在说明为什么将包含头作为导入名称空间的方法很糟糕 我看到的唯一解决办法是纪律。标准库函数要求包含适当的标题,项目应采用相同的标准。诸如
MyLib.h
之类的头文件应该只包含它定义的类型及其函数原型。如果它需要使用某个类型来完成它的工作,那么应该显式地包含头,因此如果它需要AAA
中的定义,那么它应该包含AAA.h
,如果它需要BBB
中的一些定义,那么它应该包含BBB.h
,同样包括任何实现文件(比如MyLib.c
)应该明确地包括它使用的任何定义的所有标题,而不管是否确保MyLib.h
也包括它们永远不要假设头通过包含其他头来隐式定义任何内容
这很容易使用IDE进行检查,IDE通常会告诉您名称的定义位置,因此您可以很容易地找出要使用的包含文件。可能有可用的工具可以进行此类检查。我认为最好避免依赖公共接口头中的其他头,这样就不会出现此问题 公共接口头不应包含不必要的定义 在不包含文件的情况下执行操作有各种技巧。例如,如果您只需要一个指针(仅定义typedef的库会阻止此操作),您可以手动声明结构标记,并且可以使用
\u Bool
而不是Bool
来避免
。不幸的是,许多重要类型,如size\u t
和uint32\u t
仅在标题中定义
有些包甚至使用configure定义自己的
foo\u uint32\u t
,因此它们不需要在公共接口头中包含
。这相当棘手,因为类型必须完全相同以避免混淆:即使sizeof(unsigned int)==sizeof(unsigned long)==4,它们也是不同的类型。因此,这可能不值得。您是对的,它需要注释,因为有时头被记录为包含其他头,或者头通过包含其他文件在内部实现。您不想涉过大量误报,因为您的代码依赖于/compiler/internals/stl_vector\u impl.h
中定义的某些内容,而您的所有应用程序都是
,或者用户定义的库遵循了类似的组织。GCC可以选择查看哪些头包含哪些其他头: