我想你们都知道什么是标题中的循环依赖。 它的结果通常是这样的:C++头文件中的循环依赖。怎么找?
错误:“MyClass的”在此范围
未声明如果程序很短很清楚该怎么做。 但如果程序有几十个文件...
我的问题是“是否有一些算法找到循环依赖?” 我的意思是某些步骤可以让你获得成功,而不仅仅是“直到你找到它才能查看代码”。
可能是一些程序,这样做?
我想你们都知道什么是标题中的循环依赖。 它的结果通常是这样的:C++头文件中的循环依赖。怎么找?
错误:“MyClass的”在此范围
未声明如果程序很短很清楚该怎么做。 但如果程序有几十个文件...
我的问题是“是否有一些算法找到循环依赖?” 我的意思是某些步骤可以让你获得成功,而不仅仅是“直到你找到它才能查看代码”。
可能是一些程序,这样做?
文档工具Doxygen可以生成显示依赖关系的图表。我用它来显示不同库的头文件之间的循环依赖关系。
But if the program has tens of files...
然后它仍然很短。转到编译器错误消息中提到的行,查看类是否可用。如果问题出现在* .cpp,#include相应的文件中。如果标题出现问题,请添加前向声明(class MyClass;
)。如果前向声明不够,将声明myclass的#include文件。如果这会导致循环依赖,那么每个头文件的类型太多。将标题拆分为几个较小的标题。其中一种方法是在整个程序中为每个头文件分配一个类,但在很多情况下,这可能是矫枉过正的。
至少有一个我知道的编译器(Visual C++)有一个名为“show includes”的选项,可以帮助您跟踪包含顺序。这可以帮助您找出周期发生的位置。如果你的编译器没有这样的选项,你可以在你的文件的开头添加#pragma消息(或者等价的)来追踪它。
相关但不是真正的重复:http://stackoverflow.com/questions/614794/c-c-detecting-superfluous-includes通常很难对不能编译的程序执行静态分析。但是我还没有发现即使在庞大的代码库中也很难检测循环依赖。 – pmr
我对此的解决方案是从不在头中包含其他文件,并且始终在实现.cpp文件中包含所需的头文件。通常我有(用VS)所有常用的东西的预编译头文件,然后是我正在处理的特定项目的所有东西的另一个头文件。 – Robinson