Comment définir une macro AC avec plusieurs instructions

J’essaie de définir une macro qui a deux lignes / instructions, c’est comme:

#define FLUSH_PRINTF(x) printf(x);fflush(stdout); 

mais cela ne peut pas fonctionner en raison de la limite avec laquelle les macros C ne peuvent pas fonctionner avec ‘;’.

Y a-t-il un moyen raisonnable de contourner le problème?

PS: Je sais que l’exemple supérieur est bizarre et que je devrais utiliser quelque chose comme une fonction normale. mais c’est juste un exemple simple que je veux interroger sur la façon de définir une macro de plusieurs instructions .

C’est le moment approprié d’utiliser l’idiome do { ... } while (0) . C’est également le bon moment pour utiliser des arguments de macro variadiques .

 #define FLUSH_PRINTF(...) \ do { \ printf(__VA_ARGS__); \ fflush(stdout); \ } while (0) 

Vous pourriez aussi faire cela avec une fonction wrapper, mais ce serait plus typé, en raison de la nécessité de recourir à vprintf .

  #include  #include  /* optional: */ static inline void flush_printf(const char *fmt, ...) { va_list ap; va_start(ap, fmt); vprintf(fmt, ap); va_end(ap); fflush(stdout); } 

La meilleure solution consiste à écrire une fonction à la place. Je ne comprends pas pourquoi vous avez besoin d’une macro en premier lieu.

En ce qui concerne la façon de faire avec une macro, il suffit de l’envelopper dans {} :

 #define FLUSH_PRINTF(x) { printf(x);fflush(stdout); } 

Ceci est parfaitement correct selon C11 6.8, résultant en une déclaration composée :

 statement: labeled-statement compound-statement expression-statement selection-statement 

Si vous souhaitez autoriser un style dangereux if instructions sans accolades (mauvaise idée), telles que:

 if(x) FLUSH_PRINTF(x); else FLUSH_PRINTF(y); 

alors vous devez utiliser l’astuce do while(0) pour envelopper la macro:

 #define FLUSH_PRINTF(x) do { printf(x);fflush(stdout); } while(0)