Haarspalterei: main mit leeren Klammern?



  • In meinem C Buch steht:

    Eine main-Funktion wird immer benötigt damit der Compiler weiß, wo er beginnen muss, dass Programm zu übersetzen. Auch wenn später mehrere Module (Funktionen), also mehrere Quellcode-Dateien, kompiliert werden (zu einer ausführbaren Datei binden), benötigen Sie immer eine main-Funktion. main heißt auf Deutsch so viel wie Hauptfunktion. Das void in der main()-Funktion steht für einen "leeren" Datentyp (mehr dazu später). void könnten Sie hier auch ganz weglassen - allerdings soll hier nicht unerwähnt bleiben, dass () und (void) in C++ nicht dasselbe sind.

    Im C Standard stehen ja die zwei erlaubten Versionen (für ein hosted Environment):

    int main(void);
    

    und

    int main(int argc, char *argv[]) { /* ... */ };
    

    Ich würde mal meinen

    int main()

    ist Unsinn, da damit für die main Funktion doch eine beliebige Anzahl/Typen von Parametern zugelassen wird

    Wie seht ihr das?



  • Rein theoretisch hat das undefiniertes Verhalten, aber dazu müsste ein Compiler schon extra bösartig programmiert sein.



  • Vertexwahn schrieb:

    allerdings soll hier nicht unerwähnt bleiben, dass () und (void) in C++ nicht dasselbe sind.

    Das seh ich ja jetzt erst. So'n Quark.



  • Nimmt eine Main überhaupt parameter entgegen wenn main() steht ?

    Trotzdem halte ich void main(void),int main(void),int main(int argc, char* argv[])
    für die besseren Varianten. Wenn du erst anfängst mit proggen solltest du einfach sauber Programieren, Keine leeren Klammer.



  • sven1978 schrieb:

    Nimmt eine Main überhaupt parameter entgegen wenn main() steht ?

    Ja, die Parameter werden trotzdem auf den Stack gelegt!

    Folgendes hab ich bei www.zotteljedi.de gefunden:

    /* ich wurde gefragt, ob main() in C eine ueberladene Funktion sei,
     * weil das doch in C gar nicht gehen koenne. Das Geheimnis ist
     * natuerlich, dass argc und argv trotzdem da sind, dem Compiler
     * durch das void nur gesagt wird, dass er keine Namen fuer diese
     * Variablen anlegen soll. Wie man hier eindrucksvoll sieht, sind
     * die Variablen trotzdem da. Mit dem gcc und dem lcc-win32 hat es
     * auf i386 geklappt.
     */
    
    #include <stdio.h>
    
    int main(void)
    {
    	int i;
    
    	for (i = 1; i < *(&i + 3); i++)
    		printf("argv[%i] = %s\n", i, *((char**)(*(&i + 4))+i));
    
    	return 0;
    }
    


  • Bashar schrieb:

    Vertexwahn schrieb:

    allerdings soll hier nicht unerwähnt bleiben, dass () und (void) in C++ nicht dasselbe sind.

    Das seh ich ja jetzt erst. So'n Quark.

    oh ... der Autor meinte bestimmt C - das hab ich schon in anderen Büchern gelesen - das in C int func(void) und int func() etwas verschiedenes ist - aber bisher bin ich über solche Dinge noch nicht gestolpert
    hab noch nie an eine solche Funktion (int func()) Parameter übergeben - wie soll das überhaupt gehen?



  • Vertexwahn schrieb:

    hab noch nie an eine solche Funktion (int func()) Parameter übergeben - wie soll das überhaupt gehen?

    stichwort varargs / variadic function
    oder einfach nur ein prototyp:

    int foo();

    und dann die implemantation
    int foo(char* p);

    sinnvoll ist das aber nur im zusammenhang mit der impliziten deklaration von funktionen. so dass, wenn eine funktion unbekannt ist, automatisch folgender prototyp angenommen wird:
    int f();



  • sven1978 schrieb:

    Nimmt eine Main überhaupt parameter entgegen wenn main() steht ?

    Trotzdem halte ich void main(void),int main(void),int main(int argc, char* argv[])
    für die besseren Varianten. Wenn du erst anfängst mit proggen solltest du einfach sauber Programieren, Keine leeren Klammer.

    void main(void) ist Schwachfug, und alles andere als sauber.



  • int foo();

    und dann die implemantation
    int foo(char* p);

    Das sind jetzt 2 verschiedene Funktionen. Überladung. Geht doch in C gar net. Nur in C++. Aber ist heutzutage sowiso jedem egal. Wer programmiert schon richtig C.
    Wenn ich einen Prototyp foo() habe und dann
    zb. aufrufe mit foo(4) bekomme ich einen Fehler. Das ist alles Humbug.
    Entweder mit Paras oder ohne. () ist daselbe wie void. Wenn jemand anderer Meinung ist bitte Handfeste Beweise !!!! 😉



  • sven1978 schrieb:

    int foo();

    und dann die implemantation
    int foo(char* p);

    Das sind jetzt 2 verschiedene Funktionen. Überladung. Geht doch in C gar net.

    Nein, das ist keine Überladung, und das sind auch nicht 2 verschiedene Funktionen. Nimm dir nen C-Compiler und probiers aus.

    Wenn ich einen Prototyp foo() habe und dann
    zb. aufrufe mit foo(4) bekomme ich einen Fehler.

    foo() ist kein Prototyp, das ist eine Funktionsdeklaration ohne Prototyp (wenn wir mal davon ausgehen, dass davor noch ein Rückgabetyp steht). Dass du da einen Fehler bekommst, ist Spekulation deinerseits, ausprobiert hast du es mit Sicherheit nicht.

    Das ist alles Humbug.

    Erzähl das denen die die ganze Zeit solche Texte schreiben wie den hier: http://www.open-std.org/jtc1/sc22/wg14/www/docs/n869/n869.txt.gz 🙄



  • In C geht zB. sowas nicht: void callback_handler(int) { ... }
    Der Name des Arguments darf nicht ausgelassen werden. Demzufolge hat man evtl. eine Warnung über unbenutzte Parameter. Man kann aber immerhin schreiben: void callback_handler() { ... }.


Anmelden zum Antworten