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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
maxweber
記事: 4
登録日時: 10年前
住所: 北陸

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

#1

投稿記事 by maxweber » 10年前

関数ポインタにおける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されたということになるのでしょうか?
(関数ポインタを宣言した際の"型"というのは上記コードでいうと具体的にどの部分を指すことになるのでしょうか?)

box
記事: 2002
登録日時: 14年前

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

#2

投稿記事 by box » 10年前

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関数付きで実行できる形であるとすると、コンパイルするために
# わざわざ全角空白を取り除く必要が出てしまう。めんどくさい。
# ていうか、ご自分だって投稿時にわざわざ全角空白を入れるのはめんどくさいですよね?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

box
記事: 2002
登録日時: 14年前

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

#3

投稿記事 by box » 10年前

簡単なサンプルを作ったので、よかったらながめてください。

コード:

#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;
}
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
maxweber
記事: 4
登録日時: 10年前
住所: 北陸

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

#4

投稿記事 by maxweber » 10年前

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

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

閉鎖

“C言語何でも質問掲示板” へ戻る