extern



  • beis schrieb:

    soweit ich weis, werden globale variablen einfach am anfang auserhalb von Funktionen definiert, z.B. in der datei a.c :

    int i;
    
    void main(void){
      .
      .
      .
    

    hier habe ich den fall, dass sich diese globale variable nur in der datei a.c benützen lässt, jedoch nicht in der quelltextdatei b.c.

    wenn ich nun zur datei a.h die variablendeklaration

    extern int i;
    

    hinzufüge kann ich auch aus der Datei b.c (sofern eine #include-Anweisung vorhanden ist) auf diese Variable zugreifen, da der linker dafür sorgt, dass das richtig in code umgewandelt wird.

    nun habe ich mit einem programm zu tun in dem in einer headerdatei nur die variablendeklaration steht (header-dateien sind doch nur zum deklarieren da?), jedoch nirgens eine variablendefinition vorhanden ist. das ganze funktioniert schon, jedoch ist das irgendwie komisch. könnte das eine eigenart des kompilers/linkers (IAR-compiler) sein oder habe ich da was falsch verstanden?
    gibt es dazu vorgaben im ANSI-C?

    1. es heißt int main(void)

    Es gibt manche globale Variablen, die in den Bibliotheken deklariert werden, zum Beispiel errno. Sobald der Compiler ein extern int wasweissich; lies, weiß er, dass diese Variable von Typ int ist und dass der Linker sich darum kümmern muss, ob die Variable in deinem Code deklariert ist oder in dem Code einer Bibliothek, die du benutzt, ist dem Compiler egal. Wenn der Linker nicht meckert und alles problemlos linkt, dann ist die Variable irgendwo deklariert. Wenn du es nicht getan hast, dann bestimmt in einer der Bibliotheken, die du benutzt. Um welche Variable handelt es sich?



  • Es ist übrigens dem Compiler egal, ob es in einer Headerdatei steht.
    Header haben keinen Sonderstatus. Deren Inhalt wird einfach anstelle des #include geklatscht vor den Compilieren. Für sie gelten daher die selben Regeln wie für .c (bzw. .cpp) Dateien.

    PS:
    Ich hoffe, du benennst nicht wirklich eine externe Variable mit i 😉



  • Bei systemen ohne betriebssystem (auch das gibt es!) heißt es

    void main (void)
    

    danke trotzdem für deine antwort!



  • beis schrieb:

    Bei systemen ohne betriebssystem (auch das gibt es!)

    Suchstichwort freestanding implementation, wer sich dazu im Standard kundig machen will.



  • beis schrieb:

    Bei systemen ohne betriebssystem (auch das gibt es!) heißt es

    void main (void)
    

    das muss mal gesagt werden. 😉
    btw: ich find's auch immer albern, wenn sich einer über 'void main(void)' beschwert



  • net schrieb:

    beis schrieb:

    Bei systemen ohne betriebssystem (auch das gibt es!) heißt es

    void main (void)
    

    das muss mal gesagt werden.

    Naja, in 'freestanding implementations' darf die Einstiegsfunktion im wesentlichen heißen, wie sie will.

    btw: ich find's auch immer albern, wenn sich einer über 'void main(void)' beschwert

    Naja, die übersetzten Programme schmieren halt bei vielen Systemen (hier) einfach ab und es nervt. Was soll denn der Quatsch überhaupt?



  • Daniel E. schrieb:

    Naja, die übersetzten Programme schmieren halt bei vielen Systemen (hier) einfach ab und es nervt.

    durch 'void main(void)' schmieren programme ab? warum?



  • net schrieb:

    Daniel E. schrieb:

    Naja, die übersetzten Programme schmieren halt bei vielen Systemen (hier) einfach ab und es nervt.

    durch 'void main(void)' schmieren programme ab? warum?

    doch, das kann passieren:

    Because the startup routines that call main could be assuming that the return value will be pushed onto the stack. If main() does not do this, then this could lead to stack corruption in the program's exit sequence, and cause it to crash.

    Quelle: http://users.aber.ac.uk/auj/voidmain.shtml



  • supertux schrieb:

    Because the startup routines that call main could be assuming that the return value will be pushed onto the stack. If main() does not do this, then this could lead to stack corruption in the program's exit sequence, and cause it to crash.

    was ist das für'n quatsch? für rückgabewerte von funktionen wird normalerweise ein register benutzt.



  • net schrieb:

    was ist das für'n quatsch? für rückgabewerte von funktionen wird normalerweise ein register benutzt.

    normalerweise != immer



  • Shade Of Mine schrieb:

    net schrieb:

    was ist das für'n quatsch? für rückgabewerte von funktionen wird normalerweise ein register benutzt.

    normalerweise != immer

    stimmt natürlich 😉
    btw: wer 'void main()' nimmt, sollte das 'exit(0)' nicht vergessen 😃


Anmelden zum Antworten