我正在重构一个 5.5k 行的 C++ DLL,将其拆分为多个较小的 DLL。不幸的是,很多代码是捆绑在一起的,在拆分 GiantDLL 的过程中,我引入了几个循环引用。
进一步来说,
//In emergeOSLib.h:
DLL_EXPORT std::wstring ELGetProcessIDApp(DWORD processID, bool fullName);
//In a couple of functions in emergeOSLib.cpp:
ELMessageBox(GetDesktopWindow(), messageText, (WCHAR*)TEXT("Emerge Desktop"), ELMB_OK|ELMB_ICONERROR|ELMB_MODAL);
//In emergeUtilityLib.h:
DLL_EXPORT int ELMessageBox(HWND hwnd, std::wstring messageText, std::wstring messageTitle, DWORD msgFlags);
//In a function in emergeUtilityLib.cpp:
out << ELGetProcessIDApp(GetCurrentProcessId(), false) << TEXT(": ") << debugText << std::endl;
瞧,一个循环引用。我很确定还有更多,这只是我现在正在处理的一个。
我做了一些研究,发现前向声明似乎是要走的路:
Resolve header include circular dependencies
Circular Dependency in C++
第二个链接甚至表明前向声明优于s#include
.
在这一点上我有两个问题。首先,如何前向声明另一个 DLL 中的函数?我的理解是编译器仍然无法找到前向声明的函数(因为它没有将第二个 DLL 编译为第一个 DLL 的一部分)并且会抱怨。其次,通常认为哪个是更好的做法,#include
声明或前向声明?