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;
そして出来上がり、1 つの循環参照。他にもあると思いますが、これは私が今扱っているものだけです。
私はいくつかの調査を行ったところ、前方宣言が進むべき道のように思われることがわかりました:
解決ヘッダーには循環依存関係が含まれています
C++ の循環依存関係
2 番目のリンクは、前方宣言がs よりも望ましいことを示唆してい#include
ます。
この時点で 2 つの質問があります。まず、別の DLL にある関数を前方宣言するにはどうすればよいでしょうか。私の理解では、コンパイラはまだ前方宣言された関数を見つけることができず (最初の DLL の一部として 2 番目の DLL をコンパイルしていないため)、文句を言うでしょう。第二に、一般的にどちらがより良い慣行と考えられていますか、#include
声明または前方宣言ですか?