ASSERT(3)                           Linux Programmer's Manual                           ASSERT(3)
NAME
       assert - abort the program if assertion is false
SYNOPSIS
       #include <assert.h>
       void assert(scalar expression);
DESCRIPTION
       If  the  macro  NDEBUG  was  defined at the moment <assert.h> was last included, the macro
       assert() generates no code, and hence does nothing at all.
Zerosquare (./30) :
Pareil. Mais c'est pas très utilisable pour une appli finalisée, surtout si les utilisateurs sont pas des codeurs.
MAY_ASSERT(n >= 2);
for(int i = 0; i < n ; i++) { ... }
 )
.  Car sans goto on aurait pas de if (ben oui on ferait comment pour sauter a travers la portion de code ? hein ?)

tst.w d0 beq.s \Valid bmi ErrorFileCorrupted subq.w #1,d0 beq ErrorFileNotFound bra ErrorWrongFileType

GT Turbo (./35) :Je crois que tout le monde l'est ici
les 68000 eurs comprendront.


)Folco (./41) :
PpHd -> ta macro ASSUME, elle ressemble à ça ? https://freedesktop.org/patch/34398/
Folco (./41) :
(et c'est quoi ce have_builtin_unreachable au passage ? yen a qui s'éclatent avec le préproc, c'est fou ça)
if (n <= 2)
  __builtin_unreachable ();
for(i = 0 ; i < 2; i++) 
)#define CHECK(condition, label, ...)                                    \
    if (!(condition)) {                                                 \
        fprintf (stderr, "%s, %s, %i\n", __FILE__, __func__, __LINE__); \
        #if #__VA_ARGS__ != ""                                          \
            fprintf(stderr, __VA_ARGS__);                               \
        #endif /* #__VA_ARGS == "" */                                   \
        goto label;                                                     \
    }  
#define CHECK(condition, label, ...)                                    \
    if (!(condition)) {                                                 \
        fprintf(stderr, "%s, %s, %i\n", __FILE__, __func__, __LINE__);  \
        fprintf(stderr, ##__VA_ARGS__, "");                             \
        goto label;                                                     \
    }Ou bien c'est le ##__VA_ARGS__ qui te gêne ? Si tu veux éviter le fprintf(stderr, ""), tu peux ajouter if (*#__VA_ARGS__) devant...
#include <stdio.h>
#include <stdbool.h>
#define CHECK(condition, label, ...)                                  \
  if (!(condition)) {                                                 \
    fprintf(stderr, "%s, %s, %i\n", __FILE__, __func__, __LINE__);    \
    fprintf(stderr, ##__VA_ARGS__, "");                               \
    goto label;                                                       \
  }
int main (int argc, char** argv)
{
  CHECK (false, pouet, "pwic\n")
    pouet:
  return 1;
}
 Pour moi, ça "stringifiais" des symboles, ça les concaténait, puis ça les déstringifiait pour en refaire un symbole, comme ici : https://gcc.gnu.org/onlinedocs/cpp/Concatenation.html#Concatenation
flanker (./54) :
Et ensuite, tu chercheras des problèmes à tes solutions


#define CHECK(condition, label, fmt, ...)                                  \
  if (!(condition)) {                                                 \
    fprintf(stderr, "%s, %s, %i\n", __FILE__, __func__, __LINE__);    \
    fprintf(stderr, fmt, ##__VA_ARGS__);                               \
    goto label;                                                       \
  }Folco (./55) :
=> En fait, je ne vois pas du tout l'intérêt du ## ici, j'ai l'impression que j'ai la meme sortie en passant directement __VA_ARGS__



