Например:
#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
Просто любопытно. Это техническое ограничение?
EDIT
Люди, кажется, думают, что есть только одно константное выражение указателя. Правда ли это правда? Например, здесь есть общая парадигма в 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
Похоже, причина в том, что switch допускает только целые значения (как сказано в предупреждении компилятора). Поэтому я полагаю, что лучше задать вопрос, почему это так? (хотя, возможно, сейчас уже слишком поздно.)