Souvent, dans les macros, vous verrez que les gens utilisent un do {...} tandis que (0) code> pour avaler le point-virgule. Je viens de trouver un exemple où ils utilisent ({...}) code> à la place, et il semble non seulement avaler le point-virgule, mais semble vous permettre de renvoyer une valeur également: #define NEW_MACRO() ({ int x = 1; int y = 2; x+y; })
if(1)
val = NEW_MACRO();
else
printf("this never prints");`
3 Réponses :
Ceci n'est pas valable dans la norme c. p>
Certains compilateurs peuvent avoir des extensions (par exemple, Expressions de déclaration ) Autoriser ce genre de chose. P>
Cette notation particulière, ({...}) code>, a été inventé par GCC autant que je sache (cela remonte au moins aussi loin que le GCC 2.7.2.3) très largement utilisé. ramassé par les compilateurs souhaitant être compatibles avec les extensions de GCC, telles que les compilateurs propriétaires d'Intel pour Linux.
+1 C'est aussi une manière tordue d'obscurcissement du code et de faire déboguer plus fort :)
do {...} tandis que (0) code> n'est pas destiné à "avaler le point-virgule". C'est pour transformer l'expression C à la déclaration C. P>
Non, il s'agit de transformer un bloc C dans une déclaration C, de sorte qu'il se comporte comme un seul "appel de fonction" en présence de si code> / ele code> et Faites code> / pendant les instructions code>.
@R C'est pour i> Quel que soit l'utilisateur l'utilise. J'ai vu cela utilisé pour i> avaler le semi-point également, il a également l'effet que vous décrivez.
Comme l'a dit Oli, cela a été inventé par GCC. L'objectif est (souvent avec leur Plusieurs fois, une telle utilisation peut être complètement évitée en utilisant les fonctions Dans d'autres cas où vous avez juste besoin d'une variable temporaire dont l'adresse que vous passez à une fonction, C99 dispose également de littéraux pouvant être utilisés pour cela. P> typeof code> extension) pour pouvoir évaluer les éléments macro-éléments une seule fois et utiliser cette valeur calculée ultérieurement en utilisant un nom. P>
inline code>. Ceux-ci ont également l'avantage (DIS) d'être plus strict sur les types. P>
+1 pour "(DIS)" et pour utiliser des littéraux composés à la place de variables laides de Temp.
Si je me rappelle, ce n'est pas standard (CCG compatible uniquement).
Ce code n'est pas c mais "gnu c".
Il y a toujours des gothas avec des macros. Quel est le problème avec les fonctions?
Bien que les fonctions soient généralement meilleures, elles ne peuvent pas être utilisées pour la programmation générique.
Associé Stackoverflow.com/Questtions/163365/...