Module im Header - was heißt dieser Code?
-
Danke für die Antwort. Den Typ des Structs kapiere ich schon (steht ja unmittelbar drüber), aber das MEAS_EXT davor einfach nicht.
Ich verstehe aber jetzt, dass es blöd war, die Frage hier so zu stellen, denn um rauszufinden, was hier wie wo definiert wird, muss ich wohl direkt mit dem Entwickler konferieren (der ist halt nur erst in zwei Wochen wieder da) oder alles hier reinstellen (in Anbetracht von 40 munter verschachtelten Header- und 14 Source- Dateien nicht praktikabel).
Muss ich halt warten.
Sorry für die sinnlose Frage.
-
Es steht doch direkt darüber, wie MEAS_EXT definiert ist. Wo besteht denn da noch Unklarheit?
-
obwohl ich selber gerade mal 2 einhalb jahre programmiere, hab ich sofort gesehen,
was MEAS_EXT bedeutet bzw. wo es definiert ist.doch dazu hab ich eine frage: wieso wird hier nicht einfach gleich extern
anstatt MEAS_EXT verwendet, so viel leserlicher ist das auch wieder nicht.
-
Ohne extern ist diese Headerdatei für den Emtwickler der Bibliothek gedacht, mit extern für den Anwender.
-
Ich hab's jetzt.
Ich wurschtel halt für mich so gut wie nie mit Defines 'rum, das hat mich verwirrt. Der Datenwust hat mich schier erschlagen, ich muss immernoch graben, aberhin kapier' ich jetzt, was das alles soll.
-
ach so, damit sie nicht für jeden laien lesbar ist, na dann =b
-
itedvo schrieb:
ach so, damit sie nicht für jeden laien lesbar ist, na dann =b
Das ist durchaus eine sehr gängige Technik bei Bibliotheken die über ein paar Zeilen Code hinaus gehen. Wie würdest du es denn sonst machen?
-
naja, wahrscheinlich eh gleich ^^
nur dass ich noch nie bibliotheken schreiben musste welche für andere nicht les-
bar sein dürfen... denn die bibliotheken welche ich geschrieben habe für meine
klasse waren und ich diese so gut wie möglich lesbar mache damit die klasse davon
lernen kann, bin eher für open source... ok, ich verdien ja mit meinen bibliotheken
auch kein geld, was wohl der grund dafür sein sollte =b
-
Das hat mit Lesbarkeit nichts zu tun, sondern mit getrennter Übersetzung. Wenn man eine globale Variable in einer Übersetzungseinheit definieren und in der anderen benutzen will, dann steht in der einen ÜE
int myvariable; // definition
und in der anderen
extern int myvariable; // deklaration
Praktisch sähe das so aus, dass die Deklaration in einem Header steht, der überall eingebunden wird, wo man Zugriff auf
myvariable
benötigt. Die Definition steht dagegen irgendwo in einem Sourcefile. Idealerweise bindet dieses File ebenfalls den Header ein, um bei eventuellen Inkonsistenzen vom Compiler benachrichtigt zu werden.
Beim Linken werden die Verweise aufgelöst, so dass in allen ÜEs auf dasselbe Objekt zugegriffen wird.Jetzt hat sich irgendein Schlaukopf gedacht, dass man zur Vermeidung von doppelt geschriebenem Code die Definitionen auch in den Header schreiben könnte. Problem: Mit
extern
gäbe es überall nur Deklarationen, aber keine Definition => der Linker meldet ein unaufgelöstes Symbol. Ohneextern
hätte man in jeder ÜE eine eigene Variable => der Linker meldet mehrfache Definitionen. Der Trick besteht also in diesem MakroMEAS_EXT
, dass man anscheinend so verwendet:// im Sourcefile, das die Definition enthalten soll: #include "myheader.h" // in jedem anderen Sourcefile, das nur die Deklaration benötigt: #define MEAS_EXTERN #include "myheader.h"
Ich hätte es wahrscheinlich so gelöst, dass man für die Definition ein Makro definieren muss, aber wer's so lieber hat ...
-
ach so, ich verstehs jetzt... das mit extern war mir schon klar, aber wegen dem
makro halt nich...