Du bist nicht angemeldet.

Werbeanzeige

1

09.03.2019, 17:21

Fragen zum der Logfile/Singleton Projekt

Hallo!
Ich habe gerade die Seiten über die Logfile/Singleton Klasse durcharbeitet, habe jedoch noch ein paar Fragen!

1.
File: Singleton.hpp
Frage: Warum muss man nach #ifndef/#define "TSINGLETON" schreiben bzw. wie kommt man dadrauf?

2.
File: Logfile.hpp
Frage: Selbes Spiel nur auf "__CLOGFILE" bezogen.

3.
File: Logfile.hpp
Frage: Welchen Zweck haben Zeile 17-26 und warum wird in den Zeilen 37-45 die Farbe als int abgefragt?

4.
File: Logfile.cpp
Frage: Bspw. Zeile 17, warum wird der char Zeiger als const deklariert?

5.
File: Logfile.cpp
Frage: Was hat Zeile 27 für eine Bedeutung/Funktion (und wie kommt man auf das "_DEBUG"?)

6.
File: Logfile.cpp
Frage: Bspw. Zeile 68, siehe Frage 4, warum wird die Farbe als int abgefragt, dann aber nicht als Zahl übergeben, sondern als "String"? Und warum wird keine Zahl in Zeile 87-98 abgefragt sondern "BLACK/RED/...", obwohl der Datentyp ein "int" ist?

7.
File: Logfile.cpp
Frage: Was haben Zeile 112-118 für eine Funktion/Bedeutung? (Ich weiß, dass in diesen der String zusammengebaut wird aber "wie?"^^)

Ich hoffe ihr könnt mir meine Fragen beantworten! :hmm:
Danke:) ^^

Projekt: https://www.dropbox.com/s/26vxs7v9dh5v8s…gleton.zip?dl=0

birdfreeyahoo

Alter Hase

Beiträge: 766

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

2

09.03.2019, 22:50

1. u. 2.: Das ist ein sogenannter Include-Guard. Die Befehle mit einem # werden vor dem Kompilieren vom Präprozessor ausgeführt. Bei einem #include wird der Inhalt der Header-Datei in die Cpp-Datei kopiert. Jetzt kann es sein, dass du die Header-Datei mehrmals in eine Cpp-Datei einbindest. Einmal direkt und einmal transitiv über andere Header-Dateien. Der Include-Guard sorgt dafür, dass der kopierte Inhalt der Header-Datei nur kompiliert wird, wenn er nicht schonmal in der gleichen Cpp-Datei vorkommt (weil dann TSINGLETON schon definiert ist (ifndef)). Das verhindert dass du die Singleton-Klasse zweimal definierst, was zu einem Compiler-Fehler führen würde.

3. Was hier definiert ist, ist eine sogenannte Enumeration. Dabei definierst du eine Sammlung aus Symbolen, welche jeweils einer Zahl entsprechen (wenn du die Werte nicht explizit angibst, zählt er automatisch hoch). BLACK wäre hier also 0, RED wäre 1 etc.. Du erhältst damit Typsicherheit weil du eine Variable vom Typ FONTCOLORS erstellen könntest, die dann diese Werte annehmen kann. Dadurch wird der Code verständlicher, da du nicht mit bedeutungslosen Zahlenwerten arbeitest. Im Hintergrund ist das aber tatsächlich ein Integer, du definierst ja nur Aliase für gewisse Zahlenwerte, deshalb kannst du das auch mit einem int verwenden.

4. Du hast nicht vor den String zu ändern, also deklarierst du ihn als const. Versuchst du es dennoch, gibt es einen Fehler.

5. Das ist wieder eine Präprozessor-Anweisung. Du fragst ab ob _DEBUG definiert ist. Das ist es, wenn du einen Debug-Build erstellst. Wenn du einen Release-Build erstellst ist das Symbol nicht definiert. Vor dem Kompilieren löst der Präprozessor diese Bedingungen auf und die richtige Zeile wird kompiliert.

6. Den ersten Teil verstehe ich nicht so ganz. Wie schon gesagt sind BLACK/RED etc. Aliase für gewisse Zahlenwerte. Du überprüfst den int also auf gewisse Zahlenwerte die als Farben interpretiert werden. Du könntest diese Variable statt vom Typ int auch vom Typ FONTCOLORS machen, dann ist das vielleicht etwas klarer.

7. Das sind sogenannte variadic arguments. Du kannst der Funktion beliebig viele Argumente geben (dargestellt durch "...") und mit den va_*-Befehlen verarbeitest du diese.

3

09.03.2019, 23:04

Erstmal Danke birdfreeyahoo!

Zu der ersten Antwort:
Ich glaube ich habe meine Frage ein bisschen falsch formuliert, denn mir geht es eher darum wie man auf "TSINGLETON" bzw. "__CLOGFILE" kommt?!

Antwort 2, 3 und 4 helfen mir weiter Danke! Die 5 Antwort verstehe ich nicht so ganz. Wann/wie/wo wird denn definiert, ob es sich um ein Debug/Release Build handelt?
Bei Frage 6 meinte ich, dass ein Integer ja normalerweise eine Zahl brauch bspw. 1/2/3... hier jedoch eine Zecihenkette, etwa RED oder GREEN, übergeben wurde. Das ganze hat sich dann aber mit deiner 2 Antwort geklärt! Mit den "variadic arguments" werde ich mich, dann erst beschäftigen, wenn diese im Buch vorkommen oder ich sie mal brauche!

Danke für deine Antwort und ich hoffe du kannst mir meine beiden (hoffentlich) letzten Fragen beantworten! ?(

Danke! :thumbsup:

birdfreeyahoo

Alter Hase

Beiträge: 766

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

4

09.03.2019, 23:41

TSINGLETON und __CLOGFILE können beliebig gewählt werden. Wichtig ist dass keine andere Header-Datei dasselbe Symbol verwendet (deshalb oft Bezug auf den Name des Headers). Dieses Symbol wird definiert sobald der Präprozessor das erste Vorkommen der Header-Datei in der Cpp-Datei erreicht. Beim nächsten Vorkommen ist das symbol bereits definiert und der Code wird nicht kompiliert. So wird eine Header-Datei pro Cpp-Datei nur einmal verwendet.

In deiner Entwicklungsumgebung kannst du das normalerweise einstellen. Eigentlich ist das ein Compiler-Flag, oft findest du aber noch weitere Unterschiede. Viele Einstellungen des Projekts unterscheiden sich im Debug- und Release-Build. Z.B. hat ein Debug-Build normal auch keine Linker-Optimierungen und von verwendeten Bibliotheken willst du die Debug-Versionen linken in einem Debug-Build. Visual Studio definiert das Symbol _DEBUG wenn du ein Debug-Build machst (eigentlich wenn du /MTd oder /MDd als Option verwendest um genau zu sein). Somit wird in diesem Fall der Code-kompiliert der Debug-Build in das Log schreibt.

RED und GREEN sind übrigens keine Zeichenketten. Zeichenketten sind immer in Anführungszeichen. Das sind Symbole, die in diesem Fall für eine Zahl stehen (sollte auch da stehen welche wenn du die Maus darüber hältst).

Beiträge: 103

Beruf: Chemiestudent

  • Private Nachricht senden

5

13.10.2019, 00:06

Hi.
Ich kann spdlog sehr empfehlen.
MfG
Johannes.
"Das Glück des Forschers besteht nicht darin, die Wahrheit zu besitzen, sondern eine Wahrheit zu erringen. Und in diesem fortschreitendem, erfolgreichen Suchen der Wahrheit - darin liegt die
eigentliche Befriedigung." Max Planck

Werbeanzeige