読者です 読者をやめる 読者になる 読者になる

素人がプログラミングを勉強していたブログ

プログラミング、セキュリティ、英語、Webなどのブログ since 2008

連絡先: すかいぷ:javascripter_  か javascripter あっと tsukkun.net skypeのほうがいいです

関数ポインタを返す関数

[09/04/21 23:17:19] qnighy/Acike: C言語で
[09/04/21 23:17:31] qnighy/Acike: 関数ポインタを返す関数って
[09/04/21 23:17:40] qnighy/Acike: どうやって宣言すればいいのかわからない
[09/04/21 23:18:23] daiki chijiwa: っvoid *
[09/04/21 23:18:38] qnighy/Acike: とりあえず、typedefとかvoid*とかはなしで
[09/04/21 23:19:18] qnighy/Acike: 関数ポインタの型宣言を関数の戻り値にたいして行う書き方をしりたい
[09/04/21 23:21:49] 糸柳: typedef 無しでできるのかな
[09/04/21 23:29:22] つっくん(javascripter):
int f() {
	return 1;
}

int (*g(void))(int) {
	return f;
}

int main(int argc, char *argv[]) {
	int (*h)(void) = g();
	printf("%d\n", h());
	return 0;
}
[09/04/21 23:29:31] つっくん(javascripter): わーにんぐでるけど
[09/04/21 23:35:26] 糸柳: 待ってろ
[09/04/21 23:35:47] 糸柳:
#include <stdio.h>

extern int shit_impl(void);

int (*ret_impl(void))(void)
{
	return shit_impl;
}

int main(void)
{
	int (*func)(void);
	func = ret_impl();
	printf("%d\n", func());
	return 0;
}

int shit_impl(void)
{
	return 3;
}
[09/04/21 23:41:32] 糸柳: int: 左端、関数の返り値である関数ポインタの返り値
(int): 右端、関数の返り値である関数ポインタの引数
*: 関数ポインタであることを示す
g: 関数名
(void): 関数の引数
[09/04/21 23:41:43] 糸柳: という順序で宣言を評価してる、で合ってるかな
[09/04/21 23:41:53] 糸柳: 関数名と関数の引数の順序が逆だったような気がする
[09/04/21 23:42:19] 糸柳: まあ詳細知りたい人は C の言語仕様書でも読みましょうというお話
[09/04/21 23:42:43] qnighy/Acike: ああそっか
[09/04/21 23:42:59] qnighy/Acike: int (*g(int param_of_g))(const char*)
[09/04/21 23:43:06] qnighy/Acike: って宣言だから
[09/04/21 23:43:28] qnighy/Acike: (*g(100))("")はint型
[09/04/21 23:43:30] qnighy/Acike: だといえる
[09/04/21 23:44:07] qnighy/Acike: つまり最後の括弧が戻り値の関数ポインタの引数
[09/04/21 23:44:29] qnighy/Acike: その前の括弧は全体の関数の引数