Konstanten mehrfach verwenden



  • also gibts nen unterschied zwischen char ..[] und char * ..
    wusst ich noch gar nicht.

    danke für deine vielen Tipps.



  • Rio_1 schrieb:

    also gibts nen unterschied zwischen char ..[] und char * ..
    wusst ich noch gar nicht.

    Ja, gibt's - den sieht man ja sogar im Quelltext 😃 (oder sehen die eckigen Klammern für dich aus wie Sternchen?)



  • nö sehn aus wie eckige Klammern :p

    mhh... also Fazit: die einbindung sollte bei Konstanten generell über das Schlüsselwort "extern" erfolgen?



  • also ich hab das ganze mal mittels SDCC Compiler getestet - mhh...
    da ging die variante nur so:

    //testcons.h
    extern const char testcons[5];
    
    //testcons.c
    const char testcons[5]="test";
    
    //main.c
    
    #include "main.h"
    #include "testcons.c" // ich konnte das ganz nur hier mit 
                          // einbindung des c files kompilieren,
                          // einbindung des headers gibt einen LINK Fehler
    #include "bank.h"
    
    //bank.c
    
    #include "bank.h"
    #include "testcons.h"
    

    Ist das normal das ich in main.c die testcons.c einbinden muss, und die einbindung von testcons.h nicht funktioniert?



  • Normal nicht - .C Files sollte man nicht includen. Und eigentlich sollte auch die Implementationsdatei ihren eigenen Header einbinden, damit sie von den selben Voraussetzungen ausgehen kann wie die Anwendungsprogramme (auf deutsch: setz' mal ein #include "testcons.h" in die 'testcons.c').

    Btw bin ich mir nicht sicher, ob const-Werte external oder internal Linkage bekommen.



  • Und eigentlich sollte auch die Implementationsdatei ihren eigenen Header einbinden, damit sie von den selben Voraussetzungen ausgehen kann wie die Anwendungsprogramme (auf deutsch: setz' mal ein #include "testcons.h" in die 'testcons.c').

    sorry, der header ist included.. hat ich bloß vergessen hinzuschreiben. Aber wie gesagt, dass ist SDCC. Keine Ahnung ob das was anders läuft. Hat mich auch gewundert. Auf jedenfall krieg ich beim einbinden des headers in main.c ein Link error...



  • // constants.h        // constants.c ist hier nicht erforderlich.
    #ifndef _CONSTANTS_H_ // Mehrfaches Einbinden der Headerdatei verhindern
    #define _CONSTANTS_H_
    
    // Deklaration und Definition in einem Rutsch.
    float PI = 3.14; 
    
    #endif // _CONSTANTS_H_
    
    // test1.h
    #ifndef _TEST1_H_ // Mehrfaches Einbinden der Headerdatei verhindern
    #define _TEST1_H_
    
    float some_func(); // Deklaration der Funktion some_func()
    
    #endif // _TEST1_H_
    
    // test1.c
    #include "test1.h"
    
    extern float PI; // Sagt dem Compiler Bescheid, das PI schon irgendwo definiert ist
    
    float some_func() // Definition der Funktion some_func()
    {
    	return 3*PI; // Nur mal so, um etwas auszugeben
    }
    

    Und nun endlich, last but not least, das Hauptprogramm:

    // main.c
    #include <stdio.h>
    #include "constants.h"
    #include "test1.h"
    
    extern float PI; // Bescheid 
    
    int main()
    {
    	float fl = PI;
    
    	printf("PI: %f\n", PI );
    	printf("some_func(): %f\n", some_func());
    
    	return 0;
    }
    

    🙂



  • // test1.h
    #ifndef _TEST1_H_ // Mehrfaches Einbinden der Headerdatei verhindern
    #define _TEST1_H_
    
    ...
    
    #endif // _TEST1_H_
    

    auch das ist längst geschehn... ich hatte das nur nicht nochmal erwähnt...
    daran liegt es nicht. Wie gesagt, für den Windows rechner funzt es, für SSDC nicht.

    ich würde konstanten im header durch extern ankündigen und im C file definieren! oder irre ich mich??? Du machst das doch gerade andersrum... und es sind auch keine Konstanten wie ich sehe..



  • Rio1 schrieb:

    auch das ist längst geschehn... ich hatte das nur nicht nochmal erwähnt...
    daran liegt es nicht. Wie gesagt, für den Windows rechner funzt es, für SSDC nicht.

    Wie lautet denn die Fehlermeldung ?

    Rio1 schrieb:

    ich würde die konstante im header durch extern ankündigen und im C file definieren. oder irre ich mich?? Du machst das doch gerade andersrum...

    Ich habe auf ein C file verzichtet und die Variable, bzw. die Konstante gleich in der Headerdatei definiert. Ja, klar kannst du das auch in eine Header- und eine C-Datei aufteilen.



  • irgendein SDCC linker error.. das müsst ich zu hause raussuchen..kann ich nur in 1 woche posten...



  • Rio1 schrieb:

    irgendein SDCC linker error.. das müsst ich zu hause raussuchen..kann ich nur in 1 woche posten...

    Bei Linker-Fehlern fallen mir eigentlich nur zwei Varianten ein - Symbol nicht gefunden (d.h. du hast vergessen, die "testcons.c" mitzucompilieren und -linken) oder mehrfache Definition (das tritt idR dann auf, wenn der Name im Header definiert wurde (und dieser Header in mehreren Übersetzungseinheiten verwendet wird)).


Anmelden zum Antworten