If и else без брекетов
Я ожидаю, что следующий код будет компилироваться. Clang и VС++ дают мне ошибку в строке с else
.
void MyFunction(std::int32_t& error)
{
std::int32_t variable = 0;
if(GetSomething())
error = EOK;
else
error = ERROR;
}
Если я положил фигурные скобки вокруг error = EOK;
, тогда он скомпилируется. Почему VС++ говорит:
незаконное другое без соответствия if
?
Мой полный код приведен ниже, заменив std:: uint32_t на typedef. Он по-прежнему дает ту же ошибку в VС++.
using sint32 = int;
#define ERROR 5;
#define EOK 0;
bool GetSomething();
void MyFunction(sint32& error)
{
sint32 variable = 0;
if (GetSomething())
error = EOK;
else
error = ERROR;
}
Ответы
Ответ 1
Если ваше определение EOK выглядит следующим образом:
#define EOK 0;
то это вызовет такой тип ошибки, потому что он принудительно завершает оператор if перед достижением else, делая его else без соответствия if. Компилятор видит этот код после замены макроса:
if(GetSomething())
error = 0;;
else
Ответ 2
Вот возможное исправление:
enum
{
EOK = 0,
ERROR = 5
};
Обратите внимание, что все идентификаторы, начинающиеся с E
, за которыми следуют либо другая буква верхнего регистра или номер, зарезервированы для использования в качестве имен макросов с помощью <cerrno>
, поэтому, чтобы избежать конфликтов имен, рассмотрите возможность использования другого соглашения об именах для ваших ошибок.
Ответ 3
Чтобы быть имплантированным и более эффективным, вы можете сделать:
error = (GetSomething()) ? 0 : 5 ;
И если вы хотите с перечислением, как говорит Мэтт, это станет:
error = (GetSomething()) ? enum.EOK : enum.ERROR ;