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 >
C/C++ Source or Header  |  2000-09-08  |  1KB  |  54 lines

  1.  
  2. /*
  3.  * C machine サンプル ~ 関数へのポインタ型を戻り値に持つ関数(ポインタ)型
  4.  *
  5.  * 「複雑な宣言子」
  6.  *
  7.  */
  8.  
  9. #include <stdio.h> 
  10.  
  11. void func1(void);
  12. void (*func2(void))(void);            // func1関数型へのポインタ型の戻り値を持つ
  13. void (*(*func3(void))(void))(void);    // func2関数型へのポインタ型の戻り値を持つ
  14.  
  15. int main(void)
  16. {
  17.     void (*pfunc1)(void);                // func1関数型へのポインタ型変数
  18.     void (*((*pfunc2)(void)))(void);    // func2関数型へのポインタ型変数
  19.  
  20.     // void (((**pfunc2_test1)(void)))(void);        // 関数型が戻り値のため、エラー
  21.     void ((*(*pfunc2_test2)(void)))(void);            // OK
  22.     void (*(*(*pfunc2_test3)(void)))(void);            // 警告
  23.  
  24.     // 動作テスト
  25.     pfunc2 = func3();    // pfunc2 に func2()関数アドレスが代入される
  26.     pfunc1 = pfunc2();    // pfunc1 に func1()関数アドレスが代入される
  27.     pfunc1();
  28.  
  29.     // 警告テスト
  30.     pfunc2 = pfunc2_test2;
  31.     pfunc2 = pfunc2_test3;    // ここで警告がでる
  32.     pfunc2 = (void (*((*)(void)))(void))pfunc2_test3;
  33.             // キャストすれば、OK
  34.  
  35.     return 0;
  36. }
  37.  
  38. void func1(void)
  39. {
  40.     puts("func1");
  41. }
  42.  
  43. void (*func2(void))(void)
  44. {
  45.     puts("func2");
  46.     return func1;
  47. }
  48.  
  49. void (*(*func3(void))(void))(void)
  50. {
  51.     puts("func3");
  52.     return func2;
  53. }
  54.