die Main-Methode



  • Janjan schrieb:

    Tut es aber nicht. Das ist schlichtweg falsch.

    Wenn ich sage, dass es "existiert", dann meine ich damit, dass es Compiler gibt die das so schlucken (z.B. VC). So lange es Compiler gibt die das tun, wird es auch Quellcode geben der void main() beinhaltet und somit kann man sowas schon mal zu Gesicht bekommen.



  • Und dann sollte man auch gleich wissen, dass der Code den man da liest Müll ist.



  • Hey Leute,

    bei mir schluckt aber ein und derselbe Compiler (gcc) beide Signaturen und dieser ist doch ein reiner C-Compiler und unterstütz somit doch eigentlich keine polymorphen Funktionen oder?

    Gruß



  • Entschuldigung.. Ich meinte nicht "polymorphen Funktionen" sondern "überladenen Funktionen"

    Gruß



  • Wo hat man denn eine polymorphe / überladene Funktion?

    Entweder mit Argumenten, oder Ohne. Beides geht nicht.

    Der Compiler sorgt dafür, dass diese Funktion entsprechend mit oder ohne Argumenten aufgerufen wird bei Programmstart.



  • eine function ist doch auch nur eine adresse die gecallt wird also was du vorher auf den stack packst ist der function dann normalerweise gleich du solltest aber dafür sorgen das du das was da drauf kommt auch wieder runter kommt. wie du das machst ist gleich.

    functionen lassen sich casten wie jede variable auch und daher lassen sich auch mehr oder weniger variablen auf den stack packen(stdcall)

    lg lolo



  • MatheStein schrieb:

    polymorphen Funktionen

    gehen nur über umwege da die code section idr. schreib geschützt ist und muß daher in die text section aber dafür ist c bzw. die compiler normal nicht ausgelegt



  • noobLolo schrieb:

    MatheStein schrieb:

    polymorphen Funktionen

    gehen nur über umwege da die code section idr. schreib geschützt ist und muß daher in die text section aber dafür ist c bzw. die compiler normal nicht ausgelegt

    ups ich war gerade bei polymorphen code das ist bischen was anderes 😃



  • @janjan

    Doch der gcc akzeptiert bei mir beide Signaturen unter Ubuntu. Kannst es selber testen

    #include<stdio.h>
    
    int main(){
    printf("Hallo Welt\n");
    return 0;
    }
    

    wird genau so akzeptiert wie

    #include<stdio.h>
    
    int main(){
    printf("Hallo Welt\n");
    return 0;
    }
    

    ...........................

    ok der main funktion kann es egal sein, ob vor ihrem Funktionsaufruf Daten auf den Stack gepackt werden, da ein Sprung aus main gleichbedeutend mit dem Programmende ist.

    Hat mich trotzdem nur gewundert, dass ein und derselbe Compiler beide Signaturen

    int main()

    int main(int argc, char** argv)

    akzeptiert was aber denke ich nur bei der main-Methode so ist, da nur diese vom Compiler fest vorgeschrieben ist oder?

    Gruß



  • noobLolo schrieb:

    eine function ist doch auch nur eine adresse die gecallt wird

    Nein. Eine Funktion ist in C das abstrakte Konzept einer Abbildung von Eingabe- zu Rückgabewerten, durch die Angabe eines Algorithmus, der das Berechungsverfahren beschreibt. Wenn eine Funktion nur eine Adresse ist, wie erklärst du dann, was Inlining ist?
    🙂



  • MatheStein schrieb:

    #include<stdio.h>
    
    int main(){
    printf("Hallo Welt\n");
    return 0;
    }
    

    wird genau so akzeptiert wie

    #include<stdio.h>
    
    int main(){
    printf("Hallo Welt\n");
    return 0;
    }
    

    Und es wundert dich, dass zwei auf das Zeichen übereinstimmende Schnippsel den gleichen Effekt haben?
    🙂



  • MatheStein schrieb:

    Doch der gcc akzeptiert bei mir beide Signaturen unter Ubuntu. Kannst es selber testen

    Und jetzt schalte Warnungen und nutze --std=c89 (oder nur 1 -?).



  • mngbd schrieb:

    noobLolo schrieb:

    eine function ist doch auch nur eine adresse die gecallt wird

    Nein. Eine Funktion ist in C das abstrakte Konzept einer Abbildung von Eingabe- zu Rückgabewerten, durch die Angabe eines Algorithmus, der das Berechungsverfahren beschreibt. Wenn eine Funktion nur eine Adresse ist, wie erklärst du dann, was Inlining ist?
    🙂

    Inlining ist eine optimierung des compilers und hat wenig mit einer function gemeinsam da sie dann nicht mehr existiert. am ende ist das ganze programm ein algorithmus der in form eines parsetree dargestellt werden kann. functionen sind wiederholt verwendete code blöcke zu denen gesprungen werden kann. damit sich das ding function nennen darf muß es eine adresse besitzen zu der du springen kannst. sonst ist es einfach inline code und keine function ein "#define add(a,b) (a+b)" wird ja auch nicht als function bezeichnet.

    lg lolo



  • noobLolo schrieb:

    in "#define add(a,b) (a+b)" wird ja auch nicht als function bezeichnet.

    Stimmt. Das ist ein kaputtes Makro.



  • Janjan schrieb:

    Stimmt. Das ist ein kaputtes Makro.

    dann zeig mir das doch mal als intaktes makro baby



  • noobLolo schrieb:

    Janjan schrieb:

    Stimmt. Das ist ein kaputtes Makro.

    dann zeig mir das doch mal als intaktes makro baby

    Um dein Makro mal zu verbessern:

    #define add(a,b) ((a)+(b))
    


  • Janjan schrieb:

    noobLolo schrieb:

    Janjan schrieb:

    Stimmt. Das ist ein kaputtes Makro.

    dann zeig mir das doch mal als intaktes makro baby

    Um dein Makro mal zu verbessern:

    #define add(a,b) ((a)+(b))
    

    den sinn hab ich noch nie begriffen 🙄

    #define add(a,b) (a+b)
    #define mul(a,b) (a*b)
    
    mul(5,add(3,4)) == 35;
    
    #define add(a,b) ((a)+(b))
    #define mul(a,b) ((a)*(b))
    
    mul(5,add(3,4)) == 35;
    
    #define mul(a,b) (a*b)
    
    mul(5,3+4) == 19;//wieso hat der depp das add(,) macro nicht verwendet...
    

    evtl. weil ich keinen anderen an meinen source lass :p



  • ist nur 1 "-"

    Gibt aber immer noch keine Fehlermeldung/Warnung oder sonst was.
    Der nimmt beide Versionen problemlos hin.

    Habe es nun auch mal unter Windows getestet und wieder wurden beide Versionen akzeptiert.

    Ist C vllt so spezifiziert, dass beide Versionen gelten?

    Gruß



  • noobLolo schrieb:

    Janjan schrieb:

    noobLolo schrieb:

    Janjan schrieb:

    Stimmt. Das ist ein kaputtes Makro.

    dann zeig mir das doch mal als intaktes makro baby

    Um dein Makro mal zu verbessern:

    #define add(a,b) ((a)+(b))
    

    den sinn hab ich noch nie begriffen 🙄

    Das nennt sich Sicherheit.

    Nehmen wir folgenden aufruf:

    add(1 << 3, 6)
    

    Dies wird ersetzt zu: (1 << 3 + 6).
    Problem: + hat eine höhere Priorität als <<, also hast du folgendes:
    (1 << (3 + 6)) - Nicht was man erwartet hat, wenn man das Makro nutzt.

    Mit den extra Klammern wäre das nicht passiert. Und die extra Klammern kosten nichts.

    Da trennt sich die Spreu vom Weizen. 😉



  • Janjan schrieb:

    Das nennt sich Sicherheit.

    eher schreib geilheit...

    5.1.2.2.1 Program startup
    1 The function called at program startup is named main. The implementation declares no
    prototype for this function. It shall be defined with a return type of int and with no
    parameters:
    int main(void) { /* ... */ }
    or with two parameters (referred to here as argc and argv, though any names may be
    used, as they are local to the function in which they are declared):
    int main(int argc, char *argv[]) { /* ... */ }
    or equivalent;9) or in some other implementation-defined manner.


Anmelden zum Antworten