Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).

#1 17-06-2019 01:19:54

wol
Membre
Lieu : Montpeul
Distrib. : Debian Stretch 9.8.0
(G)UI : xfce
Inscription : 26-03-2019

[Résolu] cast (void) dans une define en C

Salut,
je m'amusais à parcourir l'implémentation du quick sort dans la bibliothèque GNU C et je suis tombé sur la directive suivante (ligne 59) :

#define PUSH(low, high)        ((void) ((top->lo = (low)), (top->hi = (high)), ++top))


Indépendemment de son rôle dans la programme, je ne comprends ce qu'elle signifie d'un point de vue purement syntaxique. J'ai l'impression qu'il s'agit tout simplement d'une suite de trois expressions, mais je suis très confus par le cast vers (void) au début du define. Qu'est-ce que ça signifie de convertir en void ? scratchhead.gif

Si quelqu'un a une idée, je suis tout ouïe.

Dernière modification par wol (30-06-2019 18:34:21)

Hors ligne

#2 23-06-2019 09:48:04

kao
Modérateur
Distrib. : Testing
Noyau : Linux 4.quelquechose
(G)UI : Gnome 3
Inscription : 27-09-2012
Site Web

Re : [Résolu] cast (void) dans une define en C

C'est peut être une demande du pré processeur ou du compilateur, il préfère qu'il y ait marqué quelque chose plutôt que rien.
C'est pour limiter les mauvaises surprises

Hors ligne

#3 23-06-2019 09:52:40

enicar
Membre
Lieu : ailleurs
Distrib. : sid
Noyau : 5.8.7
(G)UI : openbox
Inscription : 26-08-2010

Re : [Résolu] cast (void) dans une define en C

Je pense que c'est pour dire au compilateur que l'on ne fait rien avec le résultat
de l'enchaînement de ces 3 instructions. Ce que je trouve étrange c'est que ça ressemble
à un appel de fonction sans le nom de la fonction.

Hors ligne

#4 23-06-2019 17:01:14

wol
Membre
Lieu : Montpeul
Distrib. : Debian Stretch 9.8.0
(G)UI : xfce
Inscription : 26-03-2019

Re : [Résolu] cast (void) dans une define en C

Merci pour vos réponses,
je suis allé consulter le manuel de référence de l'ANSI C pour éclaircir cette affaire, voilà ce que j'ai compris :
comme le suggère enicar, le cast (void) signal qu'on ne fait rien avec le résultat. Ainsi, si on ne mettait pas le (void) dans le define, alors l'instruction suivante :

void *ptr;
ptr = PUSH(lo, high);

serait acceptée par le compilateur sans même provoquer d'avertissement car

(top->lo = (low)), (top->hi = (high)), ++top)

est une expression valable qui vaut ++top d'après les règles d'évaluation de l'opérateur , (qui est bien un opérateur dans ce contexte et n'a rien à voir avec un appel de fonction).
En rajoutant le (void), on s'assure que l'instruction ptr = PUSH(low, high); provoque une erreur à la compilation, vu que le résultat de l'expression PUSH(low, high) est jetée aux oubliettes et ne peut être affecté à une autre variable ou servir d'opérande dans une expression.

Pour l'info, voilà ce que dit le manuel à propos de void :

A.6.7 Void
The (nonexistent) value of a void object may not be used in any way, and neither explicit nor implicit conversion to any non-void type may be applied. Because a void expression denotes a nonexistent value, such an expression may be used only where the value is not required, for example as an expression statement (Par.A.9.2) or as the left operand of a comma operator (Par.A.7.18).
An expression may be converted to type void by a cast. For example, a void cast documents the discarding of the value of a function call used as an expression statement.

Dernière modification par wol (24-06-2019 21:10:19)

Hors ligne

Pied de page des forums