glibを使用してこの問題に遭遇しました。GSList などの Glib データ構造には通常、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;
}
これは、いくつかの警告を非表示にするためのかなりの追加コードであることに議論の余地がありますが、私のコードが警告を生成するのは好きではありません。また、上記はおもちゃの例です。私が書いている実際のコードでは、関数のリストを構造体でラップすると非常に便利であることがわかりました。
これに問題があるのか 、それとももっと良い方法があるのか 知りたいです。