home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOS/V Power Report 2000 December
/
VPR0012A.BIN
/
OLS
/
CMKT111
/
cmkt111.lzh
/
Cmachine
/
sample
/
fcptrtn.c
< prev
next >
Wrap
C/C++ Source or Header
|
2000-09-08
|
1KB
|
54 lines
/*
* C machine サンプル ~ 関数へのポインタ型を戻り値に持つ関数(ポインタ)型
*
* 「複雑な宣言子」
*
*/
#include <stdio.h>
void func1(void);
void (*func2(void))(void); // func1関数型へのポインタ型の戻り値を持つ
void (*(*func3(void))(void))(void); // func2関数型へのポインタ型の戻り値を持つ
int main(void)
{
void (*pfunc1)(void); // func1関数型へのポインタ型変数
void (*((*pfunc2)(void)))(void); // func2関数型へのポインタ型変数
// void (((**pfunc2_test1)(void)))(void); // 関数型が戻り値のため、エラー
void ((*(*pfunc2_test2)(void)))(void); // OK
void (*(*(*pfunc2_test3)(void)))(void); // 警告
// 動作テスト
pfunc2 = func3(); // pfunc2 に func2()関数アドレスが代入される
pfunc1 = pfunc2(); // pfunc1 に func1()関数アドレスが代入される
pfunc1();
// 警告テスト
pfunc2 = pfunc2_test2;
pfunc2 = pfunc2_test3; // ここで警告がでる
pfunc2 = (void (*((*)(void)))(void))pfunc2_test3;
// キャストすれば、OK
return 0;
}
void func1(void)
{
puts("func1");
}
void (*func2(void))(void)
{
puts("func2");
return func1;
}
void (*(*func3(void))(void))(void)
{
puts("func3");
return func2;
}