Typedef関数ポインタ?質問する

Typedef関数ポインタ?質問する

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

typedef void (*FunctionFunc)();

いくつか質問があります。誰かが答えられるならありがたいです。

  1. なぜtypedef使用されるのですか?
  2. 構文が変ですね。その後にvoid関数名か何かがあるべきではないでしょうか? 匿名関数のようです。
  3. 関数ポインタは関数のメモリアドレスを格納するために作成されますか?

現時点では混乱しています。詳しく説明していただけますか?

ベストアンサー1

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)();

ご覧のとおり、typedef された名前を上記の定義に置き換えるだけで済みます。

難しさは、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

おすすめ記事