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.


  • Mod

    😕 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


  • Mod

    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. Ohne extern hätte man in jeder ÜE eine eigene Variable => der Linker meldet mehrfache Definitionen. Der Trick besteht also in diesem Makro MEAS_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...


Anmelden zum Antworten