假设有三个标题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的内部已经改变了.
有没有办法在这些情况下出错或发出警告?我怀疑(如果这是可能的话)它将在包含的标题中采用某种注释.
我认为最好避免依赖公共接口标头中的其他标头,这样就不会出现这个问题。
公共接口标头不应包含不必要的定义。
有多种技巧可以在没有包含文件的情况下完成任务。例如,如果您只需要一个指针(仅定义 typedef 的库会阻碍这一点),则可以手动声明结构标记,并且您可以使用_Bool而不是bool避免<stdbool.h>. 不幸的是,许多重要的类型(例如size_t和 )uint32_t仅在标头中定义。
有些包甚至foo_uint32_t使用configure 来定义自己的包,因此它们不需要包含<stdint.h>在其公共接口标头中。这是相当棘手的,因为类型必须完全相同以避免混淆:即使sizeof(unsigned int) == sizeof(unsigned long) == 4它们是不同的类型。因此,这可能不值得。