ページ 11

関数ポインタにおけるtypedefに関して

Posted: 2015年7月31日(金) 22:59
by maxweber
関数ポインタにおけるtypedefの使い方に関して質問させていただきます。

まず、下記コードは理解しています。

コード:

typedef int INTEGER; /* intをINTEGERという新しい型として宣言できる */
また下記のような構造体のtypedefの使い方も分かります。

コード:

/* struct  tagsDataStructureをS_DATA_STRUCTUREという新しい型として宣言できる*/
typedef struct tagsDataStructure {
 int dataNumber;
 int data;
} S_DATA_STRUCTURE;
しかし下記のような関数ポインタの場合はどうでしょう。。。

例えば、下記関数の関数ポインタを定義する場合、

コード:

int plus(int a, int b)
{
  return(a + b);
}
このように関数ポインタを宣言できる。

コード:

 int (*pFunc)(int, int); /* 戻り値の型(* ポインタ変数名)(引数の型) */
しかしこれは冗長なのでtypedefする。

コード:

 typedef int (*PFUNC)(int, int); /* typedefすると */
 PFUNC func_pointer; /* このように使用できる */
 func_pointer = plus;
この場合、typedefされたPFUNCは、一体どの部分に対してtype defineされたということになるのでしょうか?
(関数ポインタを宣言した際の"型"というのは上記コードでいうと具体的にどの部分を指すことになるのでしょうか?)

Re: 関数ポインタにおけるtypedefに関して

Posted: 2015年7月31日(金) 23:36
by box
maxweber さんが書きました:

コード:

 typedef int (*PFUNC)(int, int); /* typedefすると */
 PFUNC func_pointer; /* このように使用できる */
 func_pointer = plus;
この場合、typedefされたPFUNCは、一体どの部分に対してtype defineされたということになるのでしょうか?
「typedefキーワード自身とPFUNC」以外の全体です。
「int型の引数を2つとり、呼び出し元へint型を返す」ような関数へのポインターに
PFUNCという別名を付けています。

# せっかくcodeタグを使っているんだから、本来全角の空白が来ない場所にそれを書くのはやめてもらいたい。
# 仮に、載せているコードがmain関数付きで実行できる形であるとすると、コンパイルするために
# わざわざ全角空白を取り除く必要が出てしまう。めんどくさい。
# ていうか、ご自分だって投稿時にわざわざ全角空白を入れるのはめんどくさいですよね?

Re: 関数ポインタにおけるtypedefに関して

Posted: 2015年8月01日(土) 21:06
by box
簡単なサンプルを作ったので、よかったらながめてください。

コード:

#include <stdio.h>

typedef int (*PFUNC)(int, int);

int add(int a, int b)
{
    return a + b;
}

int sub(int a, int b)
{
    return a - b;
}

int mul(int a, int b)
{
    return a * b;
}

int div(int a, int b)
{
    return a / b;
}

int main(void)
{
    PFUNC f[] = { add, sub, mul, div };
    int i;

    for (i = 0; i < sizeof(f) / sizeof(f[0]); i++) {
        printf("%d\n", f[i](10, 5));
    }
    return 0;
}

Re: 関数ポインタにおけるtypedefに関して

Posted: 2015年8月03日(月) 20:46
by maxweber
下記のご回答ありがとうございます。
理解できました。(というよりスッキリしました。)
「typedefキーワード自身とPFUNC」以外の全体です。
「int型の引数を2つとり、呼び出し元へint型を返す」ような関数へのポインターに
PFUNCという別名を付けています。
サンプルコードの実装もありがとうございます。
参考にさせていただきます。

ステータスを"解決"とします。