Есть такой код: Код (Text): int main() { int *a=new int; int *b=a; int *c=new int; switch(a) { case (b): break; case (c): break; default: break; } return 0; } При компиляции cl.exe пишет, что Собственно интересует первая строчка отчета cl Возможно ли как-то сравнить указатели в таком операторе, не прибегая к if-ам? Есть ли возможность под case'ами ставить не только константы, а и переменные? P.S. Интересно, неужели Microsoft'овцам так трудно было разрешить использовать переменные под case? Вроде ассемблерная реализация не сильно усложниться.. Или это следование стандартам? [Added] Что-то подсказывает, что так делать нельзя в любом С-компиляторе.. Может тогда существует вариант попроще, чем это монструозное if (a==b) {...} else if (a==c) {...} else if (a==d) {...} else if (a==e) else {...} ? Спасибо
Если не нравится именно if/else можно так: Код (Text): int* a = new int; int* b = a; int* c = new int; int ab = (int)a ^ (int)b; switch (ab) { case 0: { } break; default: { int ac = (int)a ^ (int)c; switch (ac) { case 0: { } break; default: { //etc. } break; } } break; }
Явное приведение типов пользуй. Перед switch((size_t)a) Интересно, а если как С компилировать, не уйдет проблема?
Мм... Не монстро узорное совсем даже. Главное делать отступы разумно, т.е. не делать после каждого else новую накрутку оступа, а использовать else if как один оператор аки в пхп elseif и будет даже не хуже чем со свичем
simnet_ в switch может стоять _только_целая_ переменная или константа. после case может стоять _только_целая_константа_. Никаких переменных и т.п. (см. С99 6.8.4.2) да
zhindos Вы извращенец Нет, как оказалось это и правда стандарт такой Всем большое спасибо, проблему удалось решить с помощью макросов. Если кому-то интересно: http://www.rsdn.ru/forum/message/3082122.1.aspx Просто хотелось немного стройности спагетти-кода