我用glib遇到了这个问题。 Glib数据结构(如GSList)通常具有一个名为void * data的字段。我想存储功能列表,并得到了类似这样的一堆错误:
warning: ISO C forbids passing argument 2 of ‘g_slist_append’ between function pointer and ‘void *’ [-pedantic]
本例使用产生一堆警告的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;
}
所以我包在结构中的功能和所有的警告消失:
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;
}
这是值得商榷的,这是相当多的额外的代码,使一些警告消失,但我不喜欢我的代码生成的警告。另外,以上是玩具的例子。在我正在编写的真实代码中,事实证明,将函数列表包装在结构中非常有用。
我很想知道这是否有问题,或者是否有更好的方法。
如何给一个函数不分配一个空指针指针? –
它在理论上是未定义的,因为一些机器曾经有不同的代码地址和数据地址大小。在实践中,在当今最常见的架构中,代码和数据地址在相同的地址空间中具有相同的大小。 –
GetPointer()返回什么?第二行是你得到错误的地方吗? –