DLLを動的にロードする方法を学んでいますが、この行が理解できません
typedef void (*FunctionFunc)();
いくつか質問があります。誰かが答えられるならありがたいです。
- なぜ
typedef
使用されるのですか? - 構文が変ですね。その後に
void
関数名か何かがあるべきではないでしょうか? 匿名関数のようです。 - 関数ポインタは関数のメモリアドレスを格納するために作成されますか?
現時点では混乱しています。詳しく説明していただけますか?
ベストアンサー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