Module im Header - was heißt dieser Code?
-
Tut mir leid, wenn das gleich am Anfang 'ne blöde Frage ist, aber ich finde einfach dzu nichts.
Ich muss ein paar kleine Anpassungen in einem Programm vornehmen, das nicht von mir ist. Ich habe selber einiges in C und C++ programmiert, aber meist allein, deshalb musste ich nie groß modularisieren.
Ich muss an ein paar Variablen und Structs herumschrauben und versuche gerade herauszufinden, wo sie wie definiert sind. Den Ort habe ich gefunden, allen es bringt mich nicht weiter.#ifdef MEAS_EXTERN #define MEAS_EXT extern #else #define MEAS_EXT #endif MEAS_EXT unsigned char ucScanChan, ucMeasChan, ucInpChan, ucMeasTask, ucMeasCount, ucExtraMeasIndex, ucConversionRate, ucConversionRateActiv, ucFunction, ucAlignIdx; MEAS_EXT unsigned int uiAtmPressure, uiAtmPressureBuf; MEAS_EXT unsigned long ulMeasSetting; MEAS_EXT signed long slMeasValue, slExtraMeasValue[12]; struct MessStellenDaten { unsigned char ucState; unsigned char ucRange; unsigned char ucExpKomma; unsigned char ucNumLength; unsigned char ucElementFlag; unsigned char ucElementFlag2; unsigned char ucElementFlag3; unsigned char ucMultiplex; unsigned char ucDataFlag; unsigned char ucDataSign; signed long slGWMax; signed long slGWMin; signed long slBasis; signed long slFaktor; signed long slNullpunkt; signed long slSteigung; signed long slAnalogAnf; signed long slAnalogEnd; unsigned char ucLockMode; unsigned char ucAvgMode; signed long slNullAbgleich; signed long slSteigAbgleich; signed long slMeasValue; unsigned char ucMWFlag; unsigned char ucMWSign; signed long slMaxValue; signed long slMinValue; signed long slAvgValue; unsigned int uiAvgCount; unsigned char ucDimension[7]; unsigned char ucKommentar[21]; unsigned char ucTimeConst; signed long long sllAvgSumme; unsigned long ulAvgAnzahl; }; MEAS_EXT struct MessStellenDaten MeasData[MEAS_CHANNELS]; struct MesswertBuffer { unsigned char ucState[2]; signed long slMeasValue[2]; }; MEAS_EXT struct MesswertBuffer MeasBuf[MEAS_CHANNELS]; MEAS_EXT unsigned char ucMeasBufWrIdx; MEAS_EXT unsigned char ucMeasBufRdIdx;
könnte mir bitte jemand erklären, was vor allem
MEAS_EXT struct MessStellenDaten MeasData[MEAS_CHANNELS];
in diesem Zusammenhang bedeutet? Ich versteh' da nur Bahnhof...
Danke
-
Siehe define, MEAS_EXT ist das Schlüsselwort extern. Das heißt, dass die Variable wo anders implementiert sind (suche in .c-Dateien nach globalen Variablen) und somit hier nur bekannt gemacht werden.
Und das du dabei nur Bahnhof verstehst verstehe ich nicht bei deiner C/C++ Erfahrung.MEAS_EXT struct MessStellenDaten MeasData[MEAS_CHANNELS];
ist doch mehr als eindeutig ein extern implementiertes Array vom Typ MessStellenDaten (Struct) mit dem Namen MeasData der Größe MEAS_CHANNELS.
-
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...