36 Stimmen

Warum kein Schalter an Zeigern?

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

Ich bin nur neugierig. Ist dies eine technische Einschränkung?

EDIT

Die Leute scheinen zu glauben, dass es nur einen konstanten Zeigerausdruck gibt. Ist das aber wirklich so? Hier ist zum Beispiel ein gängiges Paradigma in Objective-C (es ist wirklich nur C, abgesehen von NSString , id y nil die nur ein Hinweis sind, so dass sie immer noch relevant sind - ich wollte nur darauf hinweisen, dass es es Das ist zwar nur eine technische Frage, aber sie wird häufig verwendet):

#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 switch nur ganzzahlige Werte zulässt (wie die Compilerwarnung sagte). Ich nehme an, eine bessere Frage wäre, warum dies der Fall ist? (obwohl es jetzt wahrscheinlich zu spät ist.)

-1voto

mlouk Punkte 1
enum boolean
{
 FALSE=0,
 TRUE=!FALSE
}boolean;
...
void *ptr=NULL;
...
switch((!ptr))
{
 case FALSE:
  ...
  break;
 case TRUE:
  ...;
  break;
}
...

Es ist möglich, den Zeiger einzuschalten.

-3voto

SonGoku68 Punkte 15

Sie brauchen nur diese Änderung in Ihrem Schalter: [ptr intValue]

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X