C++'da 'struct' ve 'typedef struct' arasındaki fark nedir?
C++'da, arasında herhangi bir fark var mı?
struct Foo { ... };
ve
typedef struct { ... } Foo;
796
3
C++'da, arasında herhangi bir fark var mı?
struct Foo { ... };
ve
typedef struct { ... } Foo;
C++'da sadece ince bir fark vardır. Bu C'den kalan bir şeydir ve bir fark yaratır.
C dili standardı (C89 §3.1.2.3, C99 §6.2.3 ve C11 §6.2.3), tag tanımlayıcıları (
struct
/union
/enum
için) ve sıradan tanımlayıcılar (typedef
ve diğer tanımlayıcılar için) dahil olmak üzere farklı tanımlayıcı kategorileri için ayrı ad alanlarını zorunlu kılar.Eğer sadece söyleseydin:
derleyici hatası alırsınız, çünkü
Foo
yalnızca etiket isim alanında tanımlanmıştır.Bunu şu şekilde beyan etmeniz gerekir:
Ne zaman bir
Foo
ya atıfta bulunmak isteseniz, onu her zaman birstruct Foo
olarak adlandırmanız gerekir. Bu hızlı bir şekilde can sıkıcı hale gelir, bu yüzden birtypedef
ekleyebilirsiniz:Artık
struct Foo
(etiket isim alanında) ve sadeceFoo
(sıradan tanımlayıcı isim alanında) aynı şeyi ifade eder vestruct
anahtar sözcüğü olmadanFoo
türünde nesneleri serbestçe bildirebilirsiniz.Yapı:
sadece bildirim ve
typedef
için bir kısaltmadır.Sonunda,
anonim bir yapı bildirir ve bunun için bir
typedef
oluşturur. Böylece, bu yapı ile etiket isim alanında bir isme sahip olmaz, sadece typedef isim alanında bir isme sahip olur. Bu aynı zamanda ileri-beyan edilemeyeceği anlamına gelir. Eğer bir ileri bildirim yapmak istiyorsanız, ona etiket isim alanında bir isim vermelisiniz.C++'da, tüm
struct
/union
/enum
/class
bildirimleri, isim aynı isimde başka bir bildirim tarafından gizlenmediği sürece, örtük olaraktypedef
'miş gibi davranır. Tüm detaylar için Michael Burr'un cevabına bakınız.Arada bir fark var, ama ince bir fark. Şu şekilde bakın:
struct Foo
yeni bir tip sunar. İkincisi, isimsiz birstruct
türü için Foo adında (yeni bir tür değil) bir takma ad oluşturur.Dolayısıyla, bir typedef her zaman başka bir tür için yer tutucu/eşanlamlı olarak kullanılır.
C++'da bir fark yoktur, ancak C'de struct Foo'nun örneklerini açıkça yapmadan bildirmenize izin vereceğine inanıyorum: