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