関数ポインタ

gtkを勉強してて、コールバック関数を登録する際、

	g_signal_connect(button,"clicked",G_CALLBACK(callback),(gpointer)"button 1");

とかしてて、このG_CALLBACK()って何してるんだろうと思ったけど、

typedef void  (*GCallback)     (void);
#define      G_CALLBACK(f)     ((GCallback) (f))

みたいな感じになってました。戻り値も引数も違う関数をとりあえずキャストして渡しとくのか…なるほど…。


動作実験。

#include<stdio.h>

int f(int x){
	return printf("%d\n",x);
}

void g(void (*f)(void)){
	printf("%d\n",((int (*)(int))f)(3));
}

int main(int argc, char const* argv[])
{
	g((void (*)(void))f);
	return 0;
}


(実行結果)
3
2

typedef使って書きなおすとこうなる。

#include<stdio.h>

typedef void  (*FUNCTION)  (void);
typedef int   (*FUNCTION2)  (int);
#define      FUNC(f)   ((FUNCTION) (f))
#define      FUNC2(f)  ((FUNCTION2) (f))

int f(int x){
	return printf("%d\n",x);
}


void g(FUNCTION f){
	printf("%d\n",FUNC2(f)(3));
}

int main(int argc, char const* argv[])
{
	g(FUNC(f));
	return 0;
}

関数ポインタとか前に勉強したときは訳分かんなかったけど少しずつ分かってきたような気がする。