Projekttyp in Makros
-
[Ich hoffe mal, das Thema ist in diesem Forenbereich richtig]
Hallo,
Ich bin relativ neu in C++ arbeite (mit VC++ 2008) aber z.Z. schon an einigen Projekten völlig verschiedener Typen (mal MFC, mal Win32-Konsole mal Win32-Projekt).
Ich stehe jetzt vor dem Problem, dass einige meiner Klassen, die ich in mehreren dieser Projekte verwende (trotz unterschiedlicher Projekttypen) Fehlermeldungen ausgeben sollen.
Wenn ich aber z.B. cout verwende, funktioniert es natürlich nicht, wenn ich diese Klasse nacher in einem "Win32-Projekt" verwende. Und umgekehrt wenn ich MSGBox (genauer Name fällt mir gerade nicht ein) nehme kann ich die Klasse nicht in Konsolenanwendungen benutzen.Da ich neulich Makros kennen gelernt habe (wie gesagt - ich bin neu) frage ich mich, ob es nicht möglich wäre, eine h-Datei zu schreiben, die Methoden zur Fehlerausgabe enthält, und die ich in jedem Projekt verwenden kann, weil sie z.B. mittels "#ifdef" zwischen versch. Projekttypen unterscheidet sodass immer der richtige Code kompiliert wird...
Denkt ihr das wäre möglich? Wenn nicht wie kann ich mein Problem sonst noch lösen?
Danke schonmal im Voraus!
MfG,
Baltram
-
Möglich ist fast alles.
Aber vielleicht ist es schlauer eine Logklasse zu haben die alle Fehler in ein Datei schreibt und am Ende anzeigt.Warum sollen deine Klassen ihre Fehlermeldungen selber ausgeben? Es reicht doch wenn sie anzeigen, dass es einen Fehler gibt.
-
Also Win32 Funktionen kannst Du überall benutzen...
Und ob Win32 Console und Windows UI Programm macht auch keinen Unterschied.Wenn es um die MFC geht ist __AFX_H__ gesetzt wenn die MFC Header included sind.
Ich benutze diesen ifdef dann um zum Beispiel weitere Funktionen mit erweiteren Überladungen für die MFC bereit zu stellen.
-
Ja, danke! Das mit dem __AFX_H__ hilft mir sehr weiter. Dann kann ich jetzt wohl immerhin schonmal MFC erkennen.
Ich könnte schon damit leben, dass Konsolenanwendungen Fehlermeldungen als Popup ausgeben. Aber lieber wäre es doch, wenn die Ausgabe auf das Konsolenfenster beschränkt wäre.
Vllt. kennt ja einer von euch noch ein Symbol (richtig?), das nur für Konsolenanwendungen definiert ist (falls es das überhaupt gibt).
Zum Vorschlag mit der Log-Klasse:
Das könnte ich mir auch vorstellen mal zu verwenden, allerdings bleibt das Problem ja bestehen, weil ich dann auch die Logklasse quasi dreimal schreiben müsste (wegen der Ausgabe) und meine anderen Klassen die ich nicht andauernd ändern möchte immer je nach Projekttyp die richtige dieser Drei includen müsste, oder?
-
Ich habe jetzt selbst eine ganze Weile rumprobiert und verwende jetzt zum Unterscheiden zwischen Win32 Konsolen- und Nicht-Konsolenprojekten folgendes:
#ifdef MessageBox
[...]In meinen Konsolenanwendungen include ich bis jetzt nämlich nie windows.h - trotzdem ist das wohl sehr amateurhaft.
Wenn ihr also noch eine bessere Möglichkeit wisst, würde ich mich sehr freuen!
-
Du irrst. Der Compiler bekommst gar nichts gesagt. Ob Console oder Windows Programm entscheidet der Linker nit der Compiler!
Es gibt auch keinerlei Einschränkungen bzgl. der API für Windows-UI oder Consolen Programme.Wenn müsstest Du also selber einen define einrichten.
Allerdings erschließt sich mir Deine Logik nicht. Meine Basis-Routinen geben niemals Fehler aus. Die werfen Excpetions oder geben Fehler zurück.
Für die Analyse und Ausgabe ist das Main-Programm verantwortlich.
-
Hmm... Ob es jetzt der Linker oder der Compiler ist - davon habe ich in der Tat keine Ahnung. Habe das Konzept vom Linker auch noch gar nicht verstanden (bzw. mich noch nie damit beschäftigt).
Dass sich dir meine Logik nicht erschließt liegt wohl daran, dass du im Gegensatz zu mir schon lange verstanden hast, wie die Systeme der Fehlerausgabe, Logging etc. funktionieren. Für mich ist das wie gesagt völliges Neuland.
Ich versuche es mal zu erklären, wie ich da rangehe: Da ich neu bin und all die Konzepte noch nicht kenne habe ich es immer so gemacht (egal ob im Hauptprogramm oder in einer Klasse oder was auch immer):
if (i < 0) { cout << "Fehler: Negativer Index" << endl; }
Da das auf Dauer zu aufwädig ist habe ich mir gedacht schreibe ich mir doch eine Klasse, die mir Methoden wie msg(), warn(), error() u.s.w. bereitstellt, sodass ich nur noch einen String als Parameter übergeben müsste.
Da aber cuot << xxx nicht immer richtig ist, müsste die Klasse den Projekttyp erkennen (über Makros dachte ich mir). Wie das geht wollte ich in diesem Thread fragen.Ich habe zwar schon mal was von "Exceptions" gehört, habe aber nur eine sehr ungefähre Vorstellung davon und wüsste nicht, wie ich damit... ich sag mal "zusammengesetzte Fehlermeldungen" ausgeben könnte, so was wie das:
cout << "Error: Index " << i << " out of Range (" << range << ")" << endl;
Wenn so was mit Exceptions etc. möglich wäre, würde ich mir das vllt mal anschauen ansonsten würde ich wohl dabei bleiben, eine eigene Ausgabeklasse zu schreiben.
Ich hoffe damit ist meine Situation jetzt etwas verständlicher...
Danke schonmal für eure Hilfe bis jetzt!