Objectif de l’accolade L’utilisation du code C trouvé sous Linux (include / linux / list.h)?

Je suis tombé sur le code suivant sous Linux (include / linux / list.h). La ligne 713 m’embrouille. En particulier, je ne comprends pas ({n = pos-> member.next; 1;}).

Que font les accolades? Pourquoi y a-t-il un ‘1’ dans cette déclaration?

Si quelqu’un pouvait expliquer cette ligne en particulier, ce serait très apprécié. Notez que je n’ai pas besoin d’explication sur le fonctionnement des listes de liens et des définitions, etc.

704 /** 705 * hlist_for_each_entry_safe - iterate over list of given type safe against removal of list entry 706 * @pos: the type * to use as a loop cursor. 707 * @n: another &struct hlist_node to use as temporary storage 708 * @head: the head for your list. 709 * @member: the name of the hlist_node within the struct. 710 */ 711 #define hlist_for_each_entry_safe(pos, n, head, member) \ 712 for (pos = hlist_entry_safe((head)->first, typeof(*pos), member);\ 713 pos && ({ n = pos->member.next; 1; }); \ 714 pos = hlist_entry_safe(n, typeof(*pos), member)) 715 

Ceci est une expression de déclaration . C’est une extension de gcc et selon la documentation 6.1 Déclarations et déclarations dans les expressions :

La dernière chose dans la déclaration composée devrait être une expression suivie d’un point-virgule; la valeur de cette sous-expression sert de valeur à la construction entière.

Lequel dans le cas, pour le code:

 ({ n = pos->member.next; 1; }) 

la valeur serait 1 . Selon la documentation:

Cette fonctionnalité est particulièrement utile pour rendre les définitions de macro «sûres» (afin qu’elles évaluent chaque opérande une fois).

Il donne cet exemple sans utiliser d’ expressions d’instruction :

 #define max(a,b) ((a) > (b) ? (a) : (b)) 

par rapport à cette version sûre , avec l’avertissement que vous connaissez le type des opérandes:

 #define maxint(a,b) \ ({int _a = (a), _b = (b); _a > _b ? _a : _b; }) 

C’est l’une des nombreuses extensions gcc utilisées dans le kernel Linux .

Il s’agit d’une extension du langage GNU appelée expression d’instruction ; ce n’est pas la norme C.