Ho riscontrato questo problema utilizzando glib. Le strutture dati di Glib, come GSList, di solito hanno un campo chiamato dati void *. Volevo funzioni memorizzare in una lista e ottenuto un sacco di errori di simile a questo:
warning: ISO C forbids passing argument 2 of ‘g_slist_append’ between function pointer and ‘void *’ [-pedantic]
Questo esempio genera una serie di avvertimenti usando gcc -Wall -ansi -pedantic
typedef int (* func) (int);
int mult2(int x)
{
return x + x;
}
int main(int argc, char *argv[])
{
GSList *functions = NULL;
func f;
functions = g_slist_append(functions, mult2);
f = (func *) functions->data;
printf("%d\n", f(10));
return 0;
}
Così ho avvolto la funzione in una struct e tutti gli avvertimenti vanno via:
struct funcstruct {
int (* func) (int);
};
int mult2(int x)
{
return x + x;
}
int main(int argc, char *argv[])
{
GSList *functions = NULL;
struct funcstruct p;
p.func = mult2;
functions = g_slist_append(functions, &p);
p = * (struct funcstruct *) functions->data;
printf("%d\n", p.func(10));
return 0;
}
e 'discutibile che questo è un bel po' di codice aggiuntivo per rendere alcuni avvisi scompaiono, ma non mi piace il mio codice per generare avvisi. Inoltre, quanto sopra sono esempi di giocattoli. Nel codice reale che sto scrivendo, risulta piuttosto utile racchiudere l'elenco delle funzioni in una struttura.
Sarei interessato a sapere se questo è problematico o se c'è un modo migliore di farlo.
fonte
2013-05-07 10:34:09
Che ne dici di non assegnare un puntatore nullo a una funzione puntatore? –
In teoria non è definito, poiché alcune macchine avevano dimensioni diverse per indirizzi di codice e indirizzi di dati. In pratica, nella maggior parte delle architetture oggi, gli indirizzi di codice e dati sono della stessa dimensione, nello stesso spazio degli indirizzi. –
Cosa restituisce GetPointer()? È quella seconda linea in cui ottieni l'errore? –