73Fermer75
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).