Как использовать переключатель с внешними константами? - PullRequest
11 голосов
/ 07 апреля 2011

В некотором файле code.cpp содержится

extern const int v1;
extern const int v2;
extern const int v3;
extern const int v4;

int _tmain(int argc, _TCHAR* argv[])
{
    int aee = v1;
    switch (aee)
    {
    case v1:
        break;
    case v2:
        break;
    case v3:
        break;
    case v4:
        break;
    }
        return
}

В другом файле definition.cpp содержится

const int v1 = 1;
const int v2 = 2;
const int v3 = 3;
const int v4 = 4;

Когда я выполняю компиляцию, я получаю ошибку C2051: выражение регистра не является постоянным Однако при удаленииextern все просто отлично.

Есть ли способ заставить его работать с extern?

Ответы [ 2 ]

8 голосов
/ 07 апреля 2011

Нет. switch работает только с полностью определенными константами целочисленного типа (включая члены-перечисления и классы, которые однозначно приводят к целочисленному типу). здесь - это ссылка на старую ссылку на MSDN, но то, что написано, остается в силе.

Эта ссылка , которую я предоставил в комментарии к другому ответу, объясняет, что компиляторы оптимизации могут выполнять в коде сборки. Если бы это было отложено до шага связывания, это было бы нелегко.

Поэтому вы должны использовать if .. else if в вашем случае.

3 голосов
/ 07 апреля 2011

Операторы Switch требуют, чтобы значения регистра были известны во время компиляции.

Причина, по которой это работает, когда вы удаляете extern, заключается в том, что вы определяете постоянный ноль.

...