2012-04-28 4 views
1

При просмотре кода моего друга, я пришел, чтобы заметить это:Объявление переменной в головке переключателя?

switch(State &state = getState()) { 
case Begin: state = Search; break; 
// other stuff similar 
} 

Что с переменной в заголовке переключателя? Он использует GCC, поэтому я думаю, что это может быть расширение GCC. Есть идеи?

+0

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

+2

Это один из трюков? Я чувствую, что к тому времени, когда у этого Q есть принятый ответ, я ощущаю что-то решительное, - –

+2

О, я не понимал, что это был Йоханнес ... Я чувствую себя обманутым в ответ. –

ответ

9

Это не секрет или расширение GCC. Переменные допускаются к объявлению в условиях таких вещей, как if s, while s, и switch es. Например:

while (char c = cin.get()) { ... } 

или

if (int* something = (int*)malloc(4)) { // but don't use malloc in C++ 
    // ... 
} 

После того, как они объявлены инициализированы, они преобразуются в значения bool и если они оценивают, чтобы true блок выполняются, и блок пропускаются в противном случае. Их область охвата такова, что конструкция, состояние которой они объявлены (а в случае if, область охвата также охватывает все блоки else if и else).

В §6.4.1 стандарта на C++ 03, он говорит

заявления Выбор выбрать один из нескольких потоков управления.

selection-statement: 

    if (condition) statement 
    if (condition) statement else statement 
    switch (condition) statement 

condition: 

    expression 
    type-specifier-seq declarator = assignment-expression 

Так как вы можете видеть, это позволяет type-specifier-seq declarator = assignment-expression в состоянии с if или switch. И вы найдете что-то подобное в разделе для «конструкций повторения».

Кроме того, switch эсов работать на целом или enum типов или экземпляров классов, которые могут быть неявно преобразованы к интегральному или enum типу (§6.4.4):

Величина условия, что является инициализированным объявлением в операторе switch - это значение объявленной переменной, если оно имеет интегральный или перечисляемый тип, или этой переменной, неявно преобразованной , в интегральный или нулевой тип в противном случае.

Я на самом деле узнал об этом FROM AN ANSWER YOU POSTED на вопрос «Скрытые особенности C++». Поэтому я рад, что могу напомнить вам об этом :)

+0

Да, но он находится на 'switch()', что означает, что он принимает только значения 'int'? – Muggen

+0

@Muggen в примере 'State' является' enum', вероятно. –

+0

это C++ 11? hmm –