1. ホーム
  2. c++

[解決済み] 型付けされた関数ポインタ?

2022-02-11 14:28:53

質問

DLLを動的にロードする方法を学んでいますが、理解できないのは次の行です。

typedef void (*FunctionFunc)();

いくつか質問があります。どなたかお答えいただける方がいらっしゃいましたら、よろしくお願いします。

  1. なぜ typedef を使用していますか?
  2. この構文は奇妙に見えます。 void は、関数名とかない方がいいのでしょうか?無名関数のように見えますが。
  3. 関数ポインタは、関数のメモリアドレスを格納するために作成されるのでしょうか?

というわけで、今、混乱しているのですが、わかりやすく教えてください。

どのように解決するのですか?

typedef は、名前と型を関連付ける言語構成要素です。
元の型と同じように使うのです、例えば

typedef int myinteger;
typedef char *mystring;
typedef void (*myfunc)();

のように使用します。

myinteger i;   // is equivalent to    int i;
mystring s;    // is the same as      char *s;
myfunc f;      // compile equally as  void (*f)();

ご覧のように、単に 型付き という名前を、上記の定義に置き換えます。

難しいのは、CやC++における関数へのポインタの構文や読みやすさにあり、また typedef は、このような宣言の可読性を向上させることができます。しかし、関数は他の単純な型とは異なり、戻り値やパラメータを持つことがあるため、関数へのポインタの宣言は時には長く、複雑なものになるため、構文は適切である。

しかし、関数へのポインタ、配列へのポインタ、その他の間接的なポインタの場合には、可読性が低下する可能性があります。

3つの質問にお答えします。

  • なぜtypedefが使われているのですか? 特に、関数へのポインタや構造体名など、コードを読みやすくするためです。

  • 構文がおかしい(関数宣言へのポインタの中) その構文は、少なくとも始めのうちは、読んでも明らかではありません。を使うことで typedef を宣言することで、読みやすくなります。

  • 関数ポインタは、関数のメモリアドレスを格納するために作成されるのですか? はい、関数ポインタは関数のアドレスを格納します。これは typedef コンパイラは,実際のコードをコンパイルする前に typedef の定義を拡張するだけです。

typedef int (*t_somefunc)(int,int);

int product(int u, int v) {
  return u*v;
}

t_somefunc afunc = &product;
...
int x2 = (*afunc)(123, 456); // call product() to calculate 123*456