4
votes

transtyper vers (void *) lors du passage du pointeur vers l'objet

Considérez l'extrait de code suivant:

void my_func(int a, void *b);
...

struct my_struct s = { };
my_func(10, (void *)&s);

Est-il nécessaire de transtyper en (void *) lors du passage de & s à la fonction?


3 commentaires

Non, ce n'est pas nécessaire. Tout pointeur d'objet peut être converti silencieusement d'avant en arrière vers et depuis void * .


@EugeneSh. Peut-être pas toujours silencieusement. void my_func (int a, void * b); int main (void) {const char * x; mon_fonc (1, x); } -> "avertissement: passer l'argument 2 de 'my_func' rejette le qualificatif 'const' du type de cible du pointeur [-Wdiscarded-qualifiers]" Pourtant d'accord dans ce cas, aucun cast nécessaire.


Spécialement quand l'indicateur gcc -pendantic est utilisé. Commande de compilation: gcc -Wall -pendantic main.c -o main


3 Réponses :


1
votes

Non, ce n'est pas obligatoire, cela rend simplement le code plus clair sur ce qui est exactement passé à la fonction.


1 commentaires

Aucun avertissement ne devrait jamais être produit sans le plâtre.



2
votes

vous n'êtes pas obligé, à quelques exceptions près, car vous pouvez recevoir l'avertissement si l'objet que vous passez à la fonction est volatile ou const - a généralement un attribut différent .

<source>: In function 'main':

<source>:17:8: warning: passing argument 1 of 'ee' discards 'volatile' qualifier from pointer target type [-Wdiscarded-qualifiers]

     ee(&g);

        ^~

<source>:6:15: note: expected 'void *' but argument is of type 'volatile int *'

 void ee(void *q)

         ~~~~~~^

<source>:18:8: warning: passing argument 1 of 'ee' discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers]

     ee(&f);

        ^~

<source>:6:15: note: expected 'void *' but argument is of type 'const int *'

 void ee(void *q)

         ~~~~~~^

Compiler returned: 0

donne cet avertissement:

void ee(void *q)
{
    pritntf("%p", q);
}

volatile int g;
const int f;

int main()
{

    ee(&g);
    ee(&f);
}


0 commentaires

4
votes

Un pointeur vers n'importe quel type peut être librement converti vers ou depuis un void * sans cast.

Section 6.3.2.3p1 du norme C déclare:

Un pointeur vers void peut être converti vers ou depuis un pointeur vers n'importe quel objet type. Un pointeur vers n'importe quel type d'objet peut être converti en pointeur vers le vide et inversement; le résultat doit comparer égal au pointeur d'origine.

La seule fois où un cast est nécessaire, c'est si vous passez un pointeur vers une fonction variadique comme printf où une conversion implicite ne peut pas se produire, car il ne saura pas quel type exact est passé dans est.

Notez que, comme pour tout type de pointeur, vous ne pouvez pas "supprimer" un qualificatif tel que const lors du passage à une fonction sans conversion. Les sections 6.3.2.3p2 indiquent:

Pour tout qualificatif q , un pointeur vers un type non- q peut être converti en un pointeur vers le q -qualifié version du type; les valeurs stockées dans les pointeurs d'origine et convertis doivent être comparables.


6 commentaires

Il n'y a pas de conversion sur aucun système moderne (sauf les systèmes 8 bits avec des espaces d'adressage nommés ou des pointeurs éloignés). Les temps de la


@P__J__ "Conversion" n'est pas une chose spécifique au système, mais un terme utilisé par la norme.


OMI c'est faux - le mot cast devrait être utilisé. La conversion et le casting signifient quelque chose de différent.


Le cast est l'opération qui effectue la conversion - Le fait de précéder une expression d'un nom de type entre parenthèses convertit la valeur de l'expression en type nommé. Cette construction s'appelle une distribution. - port70.net /~nsz/c/c11/n1570.html#6.5.4p5 .


@P__J__ Référencer votre réponse, cela n'a rien à voir avec void * et tout à voir avec les qualificatifs. Vous obtiendrez la même chose si vous passez un const int * quand un int * est attendu.


Oui - mais du point de vue pratique, cela n'a pas d'importance. Il est considéré comme une bonne pratique (et la plupart des entreprises le font) de traiter les avertissements comme des erreurs. Donc, si quelqu'un suit vos conseils - le code veut être compilé.