あなたの質問が何であるかはすぐにはわかりません。特に名前が同じであることについてですか?それとも、一般的にtypedef名の後ろにポインター型を隠すことですか?
struct Foo
C 言語の宣言では name が導入されないため、最初の部分は実際には問題になりませんFoo
。Foo
いわゆるstruct tagであり、単独では使用できません。struct Foo
宣言によって導入される完全な型名は です。つまり、型の完全な名前を形成するにはとのstruct Foo
両方が必要です。これを単独で使用できる短い typenameに型定義することは、広く普及しており、かなり便利な方法です。typename の綴りが struct タグの綴りと一致するという事実について、それについて何も変わったことは何もありません。たとえば、これはまったく問題ありませんstruct
Foo
struct Foo
Foo
typedef struct Foo {
char *data;
int stuff;
} Foo;
struct Foo f1; /* <- declares a `struct Foo` object */
Foo f2; /* <- also declares a `struct Foo` object */
struct Foo *f3; /* <- declares a pointer to `struct Foo` */
Foo *f4; /* <- also declares a pointer to `struct Foo` */
typedef 名の後ろにポインター型を隠すことについては... typedef 名が struct タグと異なる場合でも、多くの人が眉をひそめている物議を醸す慣行です。私は個人的にそのようなことを避けることを好みます。また、(例のように)ポインター型を指定するために構造体タグ名と一致する型名を使用すると、さらに悪化します。本当にそうしたい場合は、次のように typedef 名に独特のスペルを付けてください。
typedef struct Foo {
char *data;
int stuff;
} *FooPtr;
FooPtr f5; /* <- declares a pointer to `struct Foo` */
しかし繰り返しになりますが、新しい型名の後ろに を隠してポインター型がポインター型であるという事実を隠すこと*
は、コードの可読性に悪影響を及ぼすもののように感じられます。「不透明な」型、ある種の「ハンドル」を作成する必要があり、そのポインターの性質がまったく重要ではない場合、そのようなことはうまくいくかもしれません。しかし、通常のポインターでは、そのようなことを避けるのが最善です。