正常に動作する関数を載せます。
int funcs(int a, int b) { printf("%d", a + b); return a + b; } int (*se(int b))(int , int) { printf("%d\n", b); return funcs; } int main(){ int (*sp)() = se(100); int i = sp(2,3); return 0; }
次の実験コードです。
返り値がない場合とある場合で対処できるようにします。
void (*sell(void))(int, int) { return funcs; } int (*pp)() = (int(*)(int, int))sell(); // int (*pp)() = (int(*(void))(int, int))sell(); errorです。 int k = pp(1, 1);
これは、エラーやwarningは出現しませんが、funcs()内のprintfが表示されません。
主にキャストの場所とやり方だと思いますが、どこがいけないのでしょうか?
関数のポインタを返すための関数では、1つ型の関数しか返せないんでしょうか??
次はパラメータの数が異なる関数の場合です。
int func(int a, int b, int c) { printf("%d", a + b + c); return a + b + c; } void (*sell(int c))(int, int) { if(c == 0) return func; else return funcs; }
func()の方はパラメータが3つあります。
パラメータの数が異なる関数をreturnさせたい場合、どのように記述すれば良いのでしょうか?
つまり、
異なる型(返り値がある・ない、パラメータの数が異なる・パラメータなし)の関数のポインタをreturn できるような関数を記述したいです。
どなたか教えて下さい。
実験環境は、Windows 64bit visual studio cl オプションなし です。
「追記」___________________________
Saitoさんの回答とコメントを元に作ってみました。
こんな感じですかね・・・・
C
1#include<stdio.h> 2 3int func(int a, int b) { 4 return a + b; 5} 6 7void funcs(void) { 8 printf("Hello in funcs\n"); 9} 10 11int (*set(int c))() { 12 if (c) 13 return func; 14 else 15 return (int (*)(void))funcs; //一度キャストしておく 16} 17 18int main() { 19 void (*p)() = (void (*)(void))set(0); // キャストして元に戻す 20 int (*r)() = set(1); 21 22 p(); 23 printf("%d\n", r(1,40)); 24 return 0; 25}
Warning, Error共になく、正常に動作しています。
maisumakunさんの回答を見ると、未定義とされているので怖いのですが・・・・
これぐらいしか方法がなさそうです。
間違いがあったらご指摘ください。
他にも方法があれば是非教えてください。
int main() { int (*p)() = set(0); int (*r)() = set(1); ((void (*)(void))p)(); printf("%d\n", r(1,40)); return 0; }
こちらの方が分かりやすいですかね・・・
「追記2」_________________________________
あ、この場合は未定義ではないのかな?
「型変換されたポインタを関数呼出しに用い,関数の型がポインタが指すものの型と適合しない場合,その動作は未定義とする。 」
となっているようなので、呼び出しの際に元の型へ戻しておけば動作は未定義ではない
ということだと思います。
型を別のものにキャストして呼び出した場合の話なので、
とある型 → 別の型にキャスト → 元の型にキャスト → 呼び出し なら大丈夫!!
とある型 → 別の型にキャスト → 呼び出し これはダメ!!
という事ですかな?

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/08/05 09:50
2017/08/05 10:00
2017/08/05 10:15 編集
2017/08/05 10:24
2017/08/05 11:00
2017/08/05 11:01