Как использовать переключатель с внешними константами?

В некотором файле 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: выражение case не постоянное Однако, когда я удаляю extern, все просто прекрасно.

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

Ответ 1

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

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

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

Ответ 2

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

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