FarewellLe 11/11/2014 à 16:08
Bon, donc au final, j'ai ces macros :#define IF_TRUE(condition, label, ...) \
if (condition) { \
if (*#__VA_ARGS__) { \
fprintf (stderr, ##__VA_ARGS__, ""); \
fprintf (stderr, "\n"); \
} \
fprintf (stderr, "%s, %s, %i\n", __FILE__, __func__, __LINE__); \
goto label; \
}
#define IF_FALSE(condition, label, ...) IF_TRUE (!(condition), label, ##__VA_ARGS__)
Et ça donne des choses de ce genre :int main (void)
{
// Initialization
int ret = EXIT_FAILURE;
IF_FALSE (InitSdl (), SdlFail)
IF_FALSE (InitFont (), FontFail)
IF_FALSE (InitRessources(), RessourcesFail)
IF_FALSE (InitGameState(), GameStateFail)
// Game engine
IF_FALSE (GameStateEngine(), EngineFail)
ret = EXIT_SUCCESS;
// Cleanup
EngineFail:
DeinitGameState ();
GameStateFail:
DeinitRessources ();
RessourcesFail:
DeinitFont ();
FontFail:
DeinitSdl ();
SdlFail:
return ret;
}
Le IF_FALSE/TRUE est limite trop explicite, mais c'est bien plus simple à lire que IF/IFN (pour moi).