Avertissement en cas de type coulée entre pointeur et le pointeur à la fonction

StackOverflow https://stackoverflow.com/questions/1556651

  •  21-09-2019
  •  | 
  •  

Question

Je PORTAGE un code C à un environnement de puce TI DSP. Je suis aux prises avec le compilateur C.

I ont une structure de données qui inclut un pointeur vers une fonction. J'ai une fonction qui initialise la structure de données. Quelque chose comme ceci:

typedef void (*PFN_FOO)(int x, int y);

struct my_struct
{
    PFN_FOO pfn;
};

init_struct(struct my_struct *p, void *pfn)
{
    p->pfn = (PFN_FOO)pfn;
}

Dans Visual Studio et GCC ce type de code compile sans se plaindre. En fait, parce que l'argument est de type pfn void * Je ne ai pas vraiment besoin de mettre même un casting là; il jetterait juste implicitement sans se plaindre.

Dans Code Composer Studio les puces DSP de TI, je reçois "avertissement: conversion de type non valide"

Ma politique est de faire mon code compile sans avertissement préalable, donc je veux résoudre ce problème. J'ai essayé toutes sortes de casting. J'ai découvert que le compilateur est parfaitement heureux si je jetai mon pointeur void * à int d'abord, puis le jeter au bon type. Ew, beurk!

Comment puis-je faire ce casting sans le compilateur se plaindre? Dois-je vraiment jeter à int taire le compilateur?

Note: Je suis particulièrement pas à la recherche d'une solution à l'effet de « changement init_struct() d'accepter un PFN_FOO au lieu d'un void * ». Cela fonctionne pour ce bout de code simplifié, mais ne fonctionne pas dans le code actuel, qui construit une liste de choses peut-être hétérogène.

Était-ce utile?

La solution

Standard C ne supporte pas spécifiquement les conversions entre des pointeurs vers des objets de données et des pointeurs vers les fonctions. GCC et Visual Studio prennent cela comme une extension.

Si vous voulez le rendre conforme à la norme-votre fonction (mais toujours utiliser le paramètre void *), vous pouvez passer un pointeur vers un pointeur de fonction à la place. Cela fonctionne parce que la fonction se pointeurs sont des objets ordinaires, donc un pointeur vers un pointeur de fonction peut être converti en provenance et à void * très bien:

init_struct(struct my_struct *p, void *pfn)
{
    PFN_FOO *foo = pfn;
    p->pfn = *foo;
}

L'appelant doit alors créer un objet PFN_FOO temporaire pour passer un pointeur quand il fait l'appel:

PFN_FOO fp = &somefunc;
/* ... */
init_struct(p, &fp);

Autres conseils

Ne devriez-vous écrire?

typedef void (*PFN_FOO)(int x, int y);

Voir cette tutoriel .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top