Почему нет переключения на указатели? - PullRequest
25 голосов
/ 22 февраля 2010

Например:

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

Ответы [ 11 ]

0 голосов
/ 22 февраля 2010

Doh! зачем даже использовать оператор switch? операторы switch следует использовать только в том случае, если у вас есть 3 или более опций на выбор, если у вас есть 2 опции, тогда используйте оператор if () {} else {}.

Джошуа, это недопустимое использование указателя в коммутаторе.

Если вам действительно нужно использовать оператор switch, приведите его к _int64 или длинному длинному или к некоторому целочисленному типу, который, как гарантированно, будет больше или больше указателя (зависит от компилятора).

Кроме того, некоторые компиляторы могут ограничивать максимальный размер переключателя значением типа int или некоторым другим произвольным размером. в этом случае вы вообще не можете использовать оператор switch.

DC

...