Funktion in eigene Quellcodedatei auslagern
-
Ich habe eine Funktion, die ich gerne in eine eigenen Quellcodedatei auslagern würde, damit ich sie besser wiederverwenden kann:
DWORD SysErrorMessage(const int ErrorCode, wchar_t* szBuf, const DWORD ArrayLength) { DWORD result = 0; LPVOID lpMsgBuf = NULL; result = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, ErrorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPWSTR)&lpMsgBuf, 0, NULL); if (result <= ArrayLength) { wsprintf(szBuf, (LPWSTR)lpMsgBuf); } else { result = (DWORD)-1; // ErrCode } LocalFree(lpMsgBuf); return result; }Das steht in MpuTools.cpp drinne. Dazu die Heder-Datei:
DWORD SysErrorMessage(const int ErrorCode, wchar_t* szBuf, const DWORD ArrayLength);Das ist der Inhalt von MpuTools.h.
Das Hauptprogramm sieht so aus:
#include <stdio.h> #include <windows.h> #include "MpuTools.h" int main(int argc, char* argv[]) { TCHAR szBuf[80]; ZeroMemory(szBuf, sizeof(szBuf)); if (SysErrorMessage(5, szBuf, sizeof(szBuf)) >0) { wprintf(L"%s", szBuf); MessageBoxW(0, szBuf, L"Test", 0); } return 0; }Leider bringt mir das VS beim Kompilieren die Meldung:
Fehler 1 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""unsigned long __cdecl SysErrorMessage(int,wchar_t *,unsigned long)" (?SysErrorMessage@@YAKHPA_WK@Z)" in Funktion "_main". MpuTools_Test.obj
Was mache ich falsch oder was fehlt noch? Es sollte eiegntlich nicht kompilerspezifisch sein.
-
Du musst die "eigene Quellcodedatei" auch zusammen mit dem "Hauptprogramm" im einem Projekt haben (damit beides zusammen gelinkt wird).
-
Was heißt "zusammen in einem Projekt"?
Wie stelle ich das beim VS ein?
-
Projekt->Hinzufügen?
-
Ah, danke, ich war der Meinung, wenn ich die entsprechende Header_Datei includiere, dass er den Rest alleine macht.
Jetzt hab eich allerdings in der Header-Datei und in der main.cpp windows.h inkludiert, also eigentlich doppelt. Was macht man da? Es kompiliert und läuft, aber ist irgendwie unschön.
-
Wenn man Headerdateien entwickelt sollte man sich von Anfang an angewöhnen Include-Guards zu benutzen, die verhindern dass die eigenen Headerdateien mehrfach eingebunden werden. Microsoft hat das natürlich bei windows.h genauso gemacht, so dass windows.h in Wirklichkeit nur beim ersten Mal komplett durchlaufen wird.
Was eigene Projekte angeht habe ich mir angewöhnt, in Headern so wenig wie möglich zu inkludieren, also möglichst oft mit Foward-Deklarationen zu arbeiten. Ansonsten inkludiere ich bestimmte Header dort wo sie gebraucht werden, ohne Rücksicht darauf durch welche ebenfalls inkludierte Datei sie indirekt auch schon inkludiert sein könnte. Denn wenn man Rücksicht auf den Include-Baum nehmen würde, würde man sehr schnell völlig die Übersicht verlieren...
-
Dank für die Tipps.
In der Header-datei habe ich natürlcih nichts inkludiert, aber in der zugehörigen Quellcodedatei, aber das läßt sich wohl nicht vermeiden.