• person rss_feed

    Stefan’s feed

    Blog

    • chevron_right

      C-Kurs im XMPP Multi User Chat

      Stefan · Monday, 25 May, 2020 - 19:12 edit · 2 minutes

    Kann man einen C-Kurs im XMPP Multi User Chat halten? Wir versuchen es einfach mal. Die Idee: Kleine Menge an Informationen, an einem Abend oder Wochenende und dann warten bis die Teilnehmer die Möglichkeit hatten dies zu lesen.

    Heute

    Das einfachste Programm in C sieht wie folgt aus. Das Programm ist noch einfacher als "Hello World". Denn hier wird nicht mal etwas ausgegeben.

    /*
     * Datei: main.c
     * Kompilieren: gcc -o hello main.c
     */
    
    #include <stdlib.h>                 // C-Präprozessor Direktive
    
    int main(int argc, char* argv) {    // main-Funktion
      return EXIT_SUCCESS;              // main-Funktion verlassen
    }
    

    Man erstellt aus dem Quellcode eine ELF-Datei (ausführbare Datei) mit dem folgenden Befehl: gcc -o hello main.c. Hier passieren 3 Schritte: Präprozessor, Compiler, Linker. Wenn alles funktioniert, kann man das Programm mit ./hello ausführen. (Was ich vergessen habe, wir sind auf einem Linux System,... aber dies setzte ich mal voraus).

    Das ist aber schon ein Fehler drin. :-)

    /*
     * Datei: main.c
     * Kompilieren: gcc -o hello main.c
     */
    
    #include <stdlib.h>                 // C-Präprozessor Direktive
    
    int main(int argc, char* argv[]) {    // main-Funktion
      return EXIT_SUCCESS;              // main-Funktion verlassen
    }
    

    Noch ein Hinweis, ich bin beruflich kein C Programmierer. D.h. alles kann ich nicht beantworten und bei einigen Sachen muss ich auch erst nachlesen. Aber vielleicht kann man es ja zusammen erarbeiten. Ich kompiliere meine Programme i.d.R. mit einigen Optionen. Auf die sollte man vielleicht später noch mal eingehen: gcc -Wno-deprecated-declarations -pedantic -std=c18 -Wno-deprecated-declarations -pedantic -std=c18 -Wunused -Werror -g -O0 -o hello main.c Vom Ablauf,... ich würde vorschlagen ich lade die Sachen hier hoch: https://codeberg.org/DebXWoody/hello-c dann kann man immer nachlesen bzw. auch mal hin und her springen. Wenn man aber C lernen will, sollte man die Sachen am besten selber mitmachen. Die main wird von einer Standard Bibliothek aufgerufen und ist somit immer der "start" des Programms. Es ist die Funktion die also vom Betriebssystem aufgerufen wird. Wenn ich mich richtig erinnere, dann gibt es hier einen Sonderfall. Das liegt an der Speicherverwaltung. Ich glaube es hat was damit zutun, dass der Speicher in dem argv liegt nicht im Prozess gehört. Das aber nur nebenbei. Das Programm beenden mit einem return Code. Wenn alles ok ist, in der Regel mit 0 (EXIT_SUCCESS). Was sich danach in der Shell mit echo $? abfragen lässt. Die Übergabeparameter "int argc, char* argv[]" der Main-Funktion sind die Argumente, die an den Prozess übergeben werden. Also ./hello --help. Das steht dann da drin. Details folgen. Die #include C-Präprozessor Anweisung zieht den Inhalt aus der Datei stdlib.h rein - was beim Präprozessor passiert. Deswegen kennt das Programm den Namen 'EXIT_SUCCESS' und weiß, dass dies 0 ist. Ohne das #include wird der compiler einen Fehler ausgeben:

    main.c: In function ‘main’:
    main.c:10:10: error: ‘EXIT_SUCCESS’ undeclared (first use in this function)
       return EXIT_SUCCESS;              // main-Funktion verlassen
              ^~~~~~~~~~~~
    main.c:10:10: note: each undeclared identifier is reported only once for each function it appears in
    

    ‎Was der Befehl gcc -Wno-deprecated-declarations -pedantic -std=c18 -Wunused -Werror -g -O0 -o hello main.c also macht. Ist dann folgendes:

    gcc -E main.c # Preprocess only; do not compile, assemble or link.
    gcc -S main.c # Compile only; do not assemble or link.
    gcc -c main.c # Compile and assemble, but do not link.
    ld -o hello main.o # Hier fehlen aber noch weitere Parameter
    

    Wird man am Anfang nicht brauchen, aber es ist sicher nicht falsch es mal gehört zu haben und eine Vorstellung zu haben was da passiert.