我使用 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;
}
可以说这是使一些警告消失的相当多的额外代码,但我不喜欢我的代码生成警告。此外,以上是玩具示例。在我正在编写的实际代码中,将函数列表包装在结构中非常有用。
我很想知道这是否有问题,或者是否有更好的方法。