#IFNDEF, #DEFINE, Headerdateien

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
ProgBeginner
Beiträge: 76
Registriert: Mo Jul 29, 2013 2:26 pm

#IFNDEF, #DEFINE, Headerdateien

Beitrag von ProgBeginner » Di Nov 04, 2014 5:03 pm

Hallo zusammen,

Ich habe im ich glaub C++ Tutorial war das gelesen, man solle in den Headerfiles lediglich deklarieren und nichts definieren.


Sprich

Code: Alles auswählen

// blabla.h 

int i; // richtig
int i = 4; // schlechte idee
Jetzt habe ich natürlich schon C und C++ Quellcode in Mengen gesehen ( und ja, ich habe sogar im Kernelquellcode von Linux geschnüffelt ^^ - man darf ja neugierig sein ) und solche Konstruktionen in .c - Dateien und .cpp - Dateien gesehen wie:

Code: Alles auswählen

#INCLUDE <blabla>
#IFNDEF bla
#DEFINE bla 


Also entweder ich verstehe nun #IFNDEF und #DEFINE falsch, oder ich weiss auch nicht - wenn man in nem Header nichts weiter definieren soll, warum dann #IFNDEF und #DEFINE ??
Verwechsle niemals Freie Software mit Freeware - da gibt es markante Unterschiede. Freie Software kann Geld kosten, Freeware ist aber selten frei.

Benutzeravatar
darksider3
Beiträge: 347
Registriert: Fr Sep 14, 2012 6:26 pm
Wohnort: /dev/sda1
Kontaktdaten:

Re: #IFNDEF, #DEFINE, Headerdateien

Beitrag von darksider3 » Di Nov 04, 2014 5:32 pm

Für die Einbindung.
So kann man verhindern, dass die selbe Klasse(aus welchen gründen auch immer) öfter als 1x deklariert wird. Dadurch sollen wohl Fehler vermieden werden. Meist werden die DEFINES mit dem Datei(Headerfile)- oder Klassennamen benannt:
Datei: "beispiel.h"

Code: Alles auswählen

#IFNDEF beispiel_H
#DEFINE beispiel_H
class beispiel {
 int var1;
 //...
};
#ENDIF
effizienz ist, wenn ich ein loch bohre und hinterher mein nachbar auch ein bild aufhängen kann... ^^
Meine Homepage und der Microblog von mir :)
Live Life dont let Life Live You!
Am meisten Aktiv in Webentwicklung und PHP im Wiki

Benutzeravatar
oenone
Beiträge: 223
Registriert: Do Sep 01, 2011 2:42 pm
Wohnort: Bremen
Kontaktdaten:

Re: #IFNDEF, #DEFINE, Headerdateien

Beitrag von oenone » Di Nov 04, 2014 5:58 pm

ProgBeginner hat geschrieben:

Code: Alles auswählen

// blabla.h 

int i; // richtig
int i = 4; // schlechte idee
Variablen solltest du sowieso nicht im Header definieren. Wenn dann mit "extern". Eher gemeint sind wohl Funktionen. Die sollst du im Header deklarieren, aber nicht definieren. Sprich, die Implementation soll ins .c/.cpp und nicht in den Header. Ausnahmen sind hierbei inline-Funktionen und Templates.
ProgBeginner hat geschrieben:Also entweder ich verstehe nun #IFNDEF und #DEFINE falsch, oder ich weiss auch nicht - wenn man in nem Header nichts weiter definieren soll, warum dann #IFNDEF und #DEFINE ??
Ich gehe mal davon aus, dass du wirklich die .c/.cpp-Dateien meinst und nicht die Include-Guards, wie sie darksider3 erklärt hat: Wenn man plattformunabhängig(er) sein will, darf man sich nicht darauf verlassen, dass die Header immer gleich sind. Manche Dinge werden je nach Betriebssystem anders gemacht. Deshalb prüft man bei solchen Funktionen, ob nach include des Headers auch das gesuchte definiert ist (#ifndef = wenn nicht definiert) und zur Not definiert man eine händische Alternative.

Ein Beispiel wäre z.B. strlcpy, das nicht bei jedem System vorhanden ist. Deshalb inkludiert man string.h und wenn strlcpy nicht definiert ist, muss man eine eigene Implementation nehmen:

Code: Alles auswählen

#include <string.h>
#ifndef strlcpy
#define strlcpy mystrlcpy
#endif
Das kann man natürlich auch in einem Header machen, aber wenn nur eine Datei das braucht reicht es auch dort.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: #IFNDEF, #DEFINE, Headerdateien

Beitrag von Xin » Mi Nov 05, 2014 11:28 am

ProgBeginner hat geschrieben:Hallo zusammen,

Ich habe im ich glaub C++ Tutorial war das gelesen, man solle in den Headerfiles lediglich deklarieren und nichts definieren.

Sprich

Code: Alles auswählen

// blabla.h 

int i; // richtig
int i = 4; // schlechte idee
Beides schlecht, denn beides definiert die Variable i. Definieren != Initialisieren :-)
Um eine Variable nur zu deklarieren, schreibst Du 'extern' davor, was bedeutet, dass die Definition halt irgendwo anders ist.
ProgBeginner hat geschrieben:Jetzt habe ich natürlich schon C und C++ Quellcode in Mengen gesehen ( und ja, ich habe sogar im Kernelquellcode von Linux geschnüffelt ^^ - man darf ja neugierig sein ) und solche Konstruktionen in .c - Dateien und .cpp - Dateien gesehen wie:

Code: Alles auswählen

#INCLUDE <blabla>
#IFNDEF bla
#DEFINE bla 


Also entweder ich verstehe nun #IFNDEF und #DEFINE falsch, oder ich weiss auch nicht - wenn man in nem Header nichts weiter definieren soll, warum dann #IFNDEF und #DEFINE ??
Interessante Frage, die ich so noch gar nicht gefragt wurde und über die ich mir so auch noch keine Gedanken gemacht habe, weswegen die Erklärung dann auch verwirrend sein muss. ^^

Eine Antwort gibt's trotzdem drauf: Präprozessor-Befehle sind Präprozessor-Befehle und keine C- oder C++Anweisungen. Ein #define definiert keine Symbole in C, sondern für den Präprozessor. Das ist okay, denn die kommen so nicht im C-Compiler an.
Der Präprozessor wird vor dem Compiler laufen gelassen, führt Ersetzungen durch (die mit Define beschrieben werden) und fügt Texte ein (per #include) oder lässt Texte weg (#ifndef...). In den Compiler kommt das, was beim Präprozessor hinten raus kommt.

Hier sind zwei Sprachen quasi in Reihe geschaltet.
Du kannst den C-Präprozessor auch unabhängig vom Compiler mit dem Befehl "cpp" aufrufen und damit eigene Probleme unabhängig von C oder C++ lösen. Früher war der Arbeitsspeicher zu klein, um das alles in einem Rutsch zu machen und daher versuchte man eben viele kleine Probleme zu lösen, statt ein Großes.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten