В Stroustrup Язык программирования С++: Special Edition (3-е изд.), Stroustrup пишет, что объявление и инициализация переменных в условных выражениях управляющих операторов не только разрешены, но и поощряются. Он пишет, что поощряет его, потому что он уменьшает объем переменных только до области, для которой они необходимы. Так что-то вроде этого...
if ((int i = read(socket)) < 0) {
// handle error
}
else if (i > 0) {
// handle input
}
else {
return true;
}
... хороший стиль программирования и практика. Переменная i
существует только для блока операторов if
, для которых это необходимо, и затем выходит за рамки.
Однако эта функция языка программирования, похоже, не поддерживается g++ (версия 4.3.3 Ubuntu specific compile), что удивительно для меня. Возможно, я просто вызываю g++ с флагом, который отключает его (флагов, которые я назвал, это -g
и -Wall
). Моя версия g++ возвращает следующую компиляцию при компиляции с этими флагами:
socket.cpp:130: error: expected primary-expression before ‘int’
socket.cpp:130: error: expected `)' before ‘int’
В ходе дальнейшего исследования я обнаружил, что я, похоже, не единственный, у кого есть компилятор, который этого не поддерживает. И, похоже, возникла некоторая путаница в этом вопросе относительно того, какой синтаксис предположительно был стандартным в языке и какие компиляторы с ним компилируются.
Итак, вопрос в том, какие компиляторы поддерживают эту функцию и какие флаги должны быть установлены для ее компиляции? Это вопрос того, чтобы быть в определенных стандартах, а не в других?
Кроме того, просто из любопытства, люди вообще согласны с Stroustrup, что это хороший стиль? Или это ситуация, когда создатель языка получает в голове идею, которая не обязательно поддерживается языковым сообществом?