Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 是否有一种方法可以检测文件依赖关系是否为;意外地;满意的?_C_Header_Include - Fatal编程技术网

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可以选择查看哪些头包含哪些其他头: