Bu sorunu glib kullanarak karşılaştım. GSList gibi Glib veri yapıları genellikle void * verileri olarak adlandırılan bir alana sahiptir. Bir listenizdeki mağaza fonksiyonları istediğini ve buna benzer hataların bir grup var:
warning: ISO C forbids passing argument 2 of ‘g_slist_append’ between function pointer and ‘void *’ [-pedantic]
Bu örnek kullanarak uyarıların bir demet oluşturur 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;
}
yüzden sarılmış bir yapı içinde fonksiyon ve bütün uyarılar go away:
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;
}
Bu ekstra kod biraz birkaç uyarı yok etmek için olduğunu tartışılabilir, ama uyarılar üretmek için kodumu sevmiyorum. Ayrıca, yukarıdaki oyuncak örnekleridir. Yazmakta olduğum gerçek kodda, bir yapıdaki işlevlerin listesini sarmalamak oldukça yararlıdır.
Sorunlu olup olmadığını veya bunu yapmanın daha iyi bir yolu olup olmadığını öğrenmek isterim.
#include <dlfcn.h>
int
main(int argc, char *argv[])
{
...
void (*funcp)(void); /* Pointer to function with no arguments */
...
*(void **) (&funcp) = dlsym(libHandle, argv[2]);
}
nasıl bir işleve bir boşluk işaretçi atama hakkında değil Işaretçi? –
Teoride tanımlanmamıştır çünkü bazı makineler kod adresleri ve veri adresleri için farklı boyutlara sahipti. Pratikte, bugün en yaygın mimaride, kod ve veri adresleri aynı adres alanında aynı boyuttadır. –
GetPointer() ne döndürüyor? Hatayı aldığınız ikinci satır mı? –