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