web-dev-qa-db-fra.com

si et sans accolades

Je m'attends à ce que le code suivant soit compilé. Clang et VC++ me donnent une erreur sur la ligne avec else.

void MyFunction(std::int32_t& error)
{
   std::int32_t variable = 0;
   if(GetSomething())
      error = EOK;
   else
      error = ERROR;
}

Si je mets des accolades autour de error = EOK;, alors il compile. Pourquoi VC++ dit-il:

illégale sans correspondance si

?


Mon code complet est ci-dessous, remplaçant std :: uint32_t par un typedef. Cela donne toujours la même erreur dans VC++.

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;
}
39
Graznarak

Si votre définition de EOK est la suivante:

#define EOK 0; 

alors, ce type d'erreur se produirait, car il mettrait fin de force à l'instruction if avant que le paramètre else ne soit atteint, ce qui en ferait un autre sans identificateur if correspondant. Le compilateur voit ce code après le remplacement de la macro:

if(GetSomething())
    error = 0;;
else
94
T.W.R. Cole

Voici une solution possible:

enum
{
    EOK = 0,
    ERROR = 5
};

Notez que tous les identificateurs commençant par E suivi d'une autre lettre majuscule ou d'un nombre sont réservés pour être utilisés comme noms de macro par <cerrno>. Par conséquent, pour éviter les conflits de noms, envisagez d'utiliser une convention de dénomination différente pour vos erreurs.

15
M.M

Pour être implicite et plus efficace, vous pouvez faire:

error = (GetSomething()) ? 0 : 5 ;

Et si vous voulez enum comme dit Matt, il devient:

error = (GetSomething()) ? enum.EOK : enum.ERROR ;
0
karim