Подтвердить что ты не робот

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;
}
4b9b3361

Ответ 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 ;