Warum keine Zeiger einschalten?

Zum Beispiel:

#include <stdio.h>

void why_cant_we_switch_him(void *ptr)
{
    switch (ptr) {
        case NULL:
            printf("NULL!\n");
            break;
        default:
            printf("%p!\n", ptr);
            break;
    }
}

int main(void)
{
    void *foo = "toast";
    why_cant_we_switch_him(foo);
    return 0;
}

gcc test.c -o test
test.c: In function 'why_cant_we_switch_him':
test.c:5: error: switch quantity not an integer
test.c:6: error: pointers are not permitted as case values

Nur neugierig. Ist das eine technische Einschränkung?

BEARBEITEN

Die Leute scheinen zu glauben, dass es nur einen konstanten Zeigerausdruck gibt. Ist das wirklich wahr? Zum Beispiel ist hier ein allgemeines Paradigma in Objective-C (es ist wirklich nur C abgesehen vonNSString, id undnil, die sind nur ein Hinweis, so ist es immer noch relevant - ich wollte nur darauf hinweisen, dass esistin der Tat eine häufige Verwendung dafür, obwohl dies nur eine technische Frage ist):

#include <stdio.h>
#include <Foundation/Foundation.h>

static NSString * const kMyConstantObject = @"Foo";

void why_cant_we_switch_him(id ptr)
{
    switch (ptr) {
        case kMyConstantObject: // (Note that we are comparing pointers, not string values.)
            printf("We found him!\n");
            break;
        case nil:
            printf("He appears to be nil (or NULL, whichever you prefer).\n");
            break;
        default:
            printf("%p!\n", ptr);
            break;
    }
}

int main(void)
{
    NSString *foo = @"toast";
    why_cant_we_switch_him(foo);
    foo = kMyConstantObject;
    why_cant_we_switch_him(foo);

    return 0;
}

gcc test.c -o test -framework Foundation
test.c: In function 'why_cant_we_switch_him':
test.c:5: error: switch quantity not an integer
test.c:6: error: pointers are not permitted as case values

Es scheint, dass der Grund dafür ist, dass der Schalter nur ganzzahlige Werte zulässt (wie die Compiler-Warnung sagte). Ich nehme an, eine bessere Frage wäre zu fragen, warum dies der Fall ist. (obwohl es jetzt wahrscheinlich zu spät ist.)

Antworten auf die Frage(11)

Ihre Antwort auf die Frage