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