Dalam C, ada dua namespace yang berbeda jenis: sebuah namespace dari struct/union/tag nama enum dan namespace nama typedef. Jika anda baru saja mengatakan:
- Code: Select all
struct FlackJr { ... };
FlackJr x;
anda akan mendapatkan kesalahan kompilator, karena FlackJr hanya didefinisikan dalam tag namespace. Dan harus menyatakan sebagai:
- Code: Select all
struct FlackJr x;
Setiap kali anda ingin merujuk ke FlackJr, anda akan selalu harus menyebutnya struct FlackJr. Ini akan cepat menjengkelkan, sehingga anda dapat menambahkan sebuah typedef:
- Code: Select all
struct FlackJr { ... };
typedef struct FlackJr FlackJr;
Sekarang kedua struct FlackJr (dalam tag namespace) dan hanya plain FlackJr (dalam typedef namespace) keduanya merujuk pada hal yang sama, dan anda bebas dapat mendeklarasikan objek dari tipe FlackJr tanpa kata kunci struct.
Membangun,
- Code: Select all
typedef struct FlackJr { ... } FlackJr;
hanya sebuah singkatan untuk deklarasi dan typedef. Akhirnya,
- Code: Select all
typedef struct { ... } FlackJr;
menyatakan struktur anonim dan menciptakan typedef untuk itu. Jadi, dengan ini membangun, tidak punya nama dalam tag namespace, hanya nama dalam typedef namespace. Ini berarti juga tidak bisa forward-declared. Jika anda ingin membuat deklarasi ke depan, anda harus memberikan nama dalam tag namespace.
Dalam C++, semua struct/union/enum/class declarations bertindak seperti mereka secara implisit typedef, selama nama tidak tersembunyi oleh deklarasi yang lain dengan nama yang sama.








