Bitte kein C...

written by Martin Häcker on

Also eines muss man Programmierern lassen, erfinderisch sind sie.

Heute stellt sich mein Verständnis von C wirklich auf die Probe.

Zuerst der Vorlauf, da gibt es einen parameter controller der immer als int übergeben wird - natürlich hartkodiert und ohne jeden kommentar was wofür steht. Ok, das ist jetzt ekelhaft, aaaber.

Dieser int wird dann in einem struct element iType gespeichert. Um herauszufinden was dieser Parameter nun macht habe ich also mal durch den SourceCode gegreppt um herauszufinden was damit passiert und bin dabei auf die viel versprechende Zeile switch(self->iType) gestoßen. Groß war da meine Freude, wenn auch leider nur kurz.

switch(self->iType)
    {
            RefProg=USBprogressIndicator;
    }

Da stellt sich natürlich die Frage... was macht der Compiler daraus eigentlich? Interpretiert er es als

switch(self->iType)
    {
        case default:
            RefProg=USBprogressIndicator;
    }

oder doch als:

switch(self->iType)
    {
            RefProg=USBprogressIndicator;
        case default:
    }

i.e. heißt das eigentlich das der Code darin nicht ausgeführt wird? Und verhält sich das auf anderen Compilern / Compilerversionen genauso?

Ist doch immer wieder schön solche zoten in Sourcecode zu finden. :)

Update

Inzwischen habe ich nachgeprüft was da Sache ist. Meine Vermutung war, dass der Programmierer es ja nur im Code gelassen hätte, wenn es einen Sinn hat. Nun ja, man glaubt ja an das Gute im Menschen.

Ich musste mich dann aber doch eines besseren Belehren:

#include <stdio.h>

int main (int argc, char **argv) {
        int foo = 3;
        switch(foo) {
                printf("gotit\ne\n\n\n");
                return -1; 
        }

        printf("didn't get it\n");
        return 0;
}

Wie man am Beispiel sehen kann (mit etwas wie "gcc -o foo test.c && ./foo" ist es einfach zu zeigen das switch(foo) tatsächlich den gleichen effekt hat wie

#include <stdio.h>

int main (int argc, char **argv) {
        int foo = 3;
#if 0
                printf("gotit\ne\n\n\n");
                return -1; 
#endif

        printf("didn't get it\n");
        return 0;
}

Was ich wirklich herzlich Sinnlos finde.