externe funktionen



  • Mir ist noch was aufgefallen.
    Wie du dein Programm kompilierst ist doch zuviel des guten.
    gcc -c misc.c // sinnlos weil schon im letzten Befehl
    gcc -c main.c // sinnlos weil schon im letzten Befehl
    gcc -o app main.c misc.c

    so wär's sinnvoll
    gcc -c misc.c // erzeugt misc.o
    gcc -c main.c // erzeugt main.o
    gcc -o app main.o misc.o

    🙂



  • hallo stahl,
    na klar kannst du das auch so machen, aber:
    die in main deklarierten externen variablen kannst du in main nach belieben ändern. wenn du in main also anderer_int änderst, bekommen alle funktionen in
    misc diese änderung mit. das ist auf normale weise nicht möglich. die variable wird sozusagen global.



  • ja, hallo agrimm

    das is doch gehüpft wie gesprungen.. in beiden varianten laesst sich doch dasselbe mit den externen variablen anstellen.. ob ich nun

    /* main.c */
    extern int foo;
    
    int main(void)
    {
      // mach boese dinge mit foo
      return 0;
    }
    

    habe, oder ..

    /* xyz.h */
    extern int foo;
    /* main.c */
    #include "xyz.h"
    
    int main(void)
    { 
      // mach boese dinge mit foo
      return 0;
    }
    

    letzteres wird dann sinnvoll, wenn ich mehrere c-files diese externen varibalen/funktionen verwenden sollen.



  • Dein Beispiel:

    /* main.c */
    extern int foo; // irgendwo in meinem Projekt gibt es foo
    
    int main(void)
    {
      // mach boese dinge mit foo
      return 0;
    }
    

    Ob du Zeile 1 nun mit #include reinholst oder direkt reinschreibst (nichts anderes macht der Präprozessor) ist ziemlich egal. Beide Beispiele machen dasselbe, da hast du recht.Du musst aber wissen das du in
    Zeile 1 keine Variable erzeugst. Du sagst dem Compiler doch nur, daß in irgendeinem Modul die Variable foo vorkommt, die du gerne ändern möchtest (oder gerne Zugriff hättest).
    Klingelt's



  • dessen bin ich mir bewußt, siehe mein erstes beispiel.

    [ Dieser Beitrag wurde am 11.10.2002 um 20:00 Uhr von stahl editiert. ]



  • Dann weißt du doch worum es geht. Warum die Frage? In deinem allerersten Beispiel sagst du doch main.c (weil du misc.h "included" hast) das foo() extern ist. Bei Funktionen (!) ist das ziemlich egal, denn jede Funktion ist, soweit nicht anders deklariert extern, denn das ist die Standardeinstellung. Bei Variablen nicht, hast du auch gemerkt!
    Ich glaube aber nicht, das wenn du keinen Prototyp deklariert hast, es durch den Compiler geht.
    Es sei denn:
    Ohne Prototyp musst du die Funktion als extern in main.c deklarieren. Dann geht's durch und du brauchst die header-Datei nicht.
    Wenn du es in anderen Quellcodes gesehen hast, beziehen sich diese extern-Funktionen meisst auf Bibliotheken oder object-files, für die kein Quellcode vorhanden ist. Das Wort extern kann man sich dabei aber sparen, das ist gimmick wenn die header-files da sind.

    PS: habe deine frage recht unaufmerksam gelesen, sorry, ich dachte du wolltest wissen wozu extern da ist.



  • denn jede Funktion ist, soweit nicht anders deklariert extern

    ja, das war mir aber nicht klar als ich das thema begann. ich hab aber wie gesagt in anderen source immer wieder sowas gesehen, wo funktionen ausdrücklich als extern in den headern deklariert wurden, und das waren auch programm interne funktionen..
    ...und ich wollte wissen wozu 'extern' in diesen speziellen fällen gut ist, bzw was es bewirkt, und dazu hat mady mir ja was erzählt.

    so ich hoffe wir haben das jetzt geklärt



  • wir reden nicht von static Variablen, sondern von static Funktionen, static bei Funktionen hat eine andere Auswirkung, als bei lokalen Variablen!



  • hm halt. es reicht doch auch ein normaler prototyp der funktion, warum dem ganzen noch ein extern verpassen? hmhm...



  • Eben, überflüssig!


Anmelden zum Antworten