Как использовать переключатель с внешними константами?
В некотором файле 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
, заключается в том, что вы определяете константу нуля.