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.)