Например:
#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
Просто любопытно. Это техническое ограничение?
ИЗМЕНИТЬ
Люди, похоже, думают, что существует только одно выражение константного указателя. Правда, правда? Например, здесь есть общая парадигма в Objective-C (это действительно только C в стороне от NSString
, id
и nil
, которые являются просто указателями, поэтому они по-прежнему актуальны - я просто хотел указать что на самом деле это используется для него, несмотря на это только технический вопрос):
#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
Похоже, причина в том, что коммутатор допускает только интегральные значения (как предупреждал компилятор). Поэтому я полагаю, что лучший вопрос - спросить, почему это так? (хотя, вероятно, уже слишком поздно.)