Saya belum pernah menulis C ++ selama bertahun-tahun dan sekarang saya mencoba untuk kembali ke dalamnya. Saya kemudian berlari melintasi ini dan berpikir untuk menyerah:
typedef enum TokenType
{
blah1 = 0x00000000,
blah2 = 0X01000000,
blah3 = 0X02000000
} TokenType;
Apa ini? Kenapa itutypedef
kata kunci digunakan di sini? Mengapa nama itu TokenType
muncul dua kali dalam deklarasi ini? Apa perbedaan antara semantik dengan ini:
enum TokenType
{
blah1 = 0x00000000,
blah2=0x01000000,
blah3=0x02000000
};
Ini adalah warisan C, di C, jika Anda melakukannya:
Anda harus menggunakannya untuk melakukan sesuatu seperti:
Tetapi jika Anda melakukan ini:
Anda akan dapat mendeklarasikan:
Tetapi dalam C ++, Anda hanya bisa menggunakan definisi sebelumnya dan menggunakannya seolah-olah itu dalam C typedef.
sumber
Anda tidak perlu melakukannya. Dalam C (bukan C ++) Anda diminta untuk menggunakan enum Enumname untuk merujuk ke elemen data dari tipe yang disebutkan. Untuk mempermudah, Anda diizinkan untuk typedef ke tipe data nama tunggal.
fungsi yang diizinkan mengambil parameter enum untuk didefinisikan sebagai
bukannya lebih lama
Perhatikan bahwa nama nama ketik tidak harus sama dengan nama enum. Hal yang sama terjadi dengan struct.
Di C ++, di sisi lain, itu tidak diperlukan, karena enum, kelas dan struct dapat diakses secara langsung sebagai tipe dengan nama mereka.
sumber
Di C, itu adalah gaya yang baik karena Anda dapat mengubah jenisnya menjadi sesuatu selain enum.
Di C ++ Anda bisa mendefinisikan enum sehingga akan dikompilasi sebagai C ++ atau C.
sumber
In C++ you can *typedef* the enum so that it will compile as C++ or C.
? Anda mengatakan:In C++ you can define the enum so that it will compile as C++ or C.
Perhatikan bagaimana saya mengubah Andadefine
untuktypedef
. Yah ... Saya kiratypedef
ing adalah mendefinisikan.Penarikan dari C.
sumber
Beberapa orang mengatakan C tidak memiliki ruang nama tetapi itu secara teknis tidak benar. Ada tiga:
enum
,union
, danstruct
)typedef enum { } XYZ;
mendeklarasikan enumerasi anonim dan mengimpornya ke namespace global dengan nama tersebutXYZ
.typedef enum ABC { } XYZ;
mendeklarasikan enum bernamaABC
dalam tag namespace, lalu mengimpornya ke namespace global sebagaiXYZ
.Beberapa orang tidak ingin repot dengan ruang nama yang terpisah sehingga mereka mengetik semuanya. Lainnya tidak pernah mengetik karena mereka ingin penamaan namespace.
sumber
Ini agak tua, tapi bagaimanapun, saya harap Anda akan menghargai tautan yang akan saya ketik saat saya menghargainya ketika saya menemukannya di awal tahun ini.
Ini dia . Saya harus mengutip penjelasan yang selalu ada di pikiran saya ketika saya harus memahami beberapa typedef jahat:
Seperti yang banyak orang katakan sebelumnya, tidak perlu menggunakan typedef untuk mendeklarasikan enum di C ++ . Tapi itulah penjelasan dari sintaks typedef! Saya harap ini membantu (Mungkin bukan OP, karena sudah hampir 10 tahun, tetapi siapa pun yang berjuang untuk memahami hal-hal semacam ini).
sumber
Dalam beberapa panduan gaya kode C versi typedef dikatakan lebih disukai untuk "kejelasan" dan "kesederhanaan". Saya tidak setuju, karena typedef mengaburkan sifat asli dari objek yang dinyatakan. Bahkan, saya tidak menggunakan typedef karena ketika mendeklarasikan variabel C saya ingin menjadi jelas tentang apa objek sebenarnya. Pilihan ini membantu saya untuk mengingat lebih cepat apa yang sebenarnya dilakukan oleh sepotong kode lama, dan akan membantu orang lain ketika menjaga kode di masa depan.
sumber
Jawaban aktual untuk pertanyaan "mengapa" (yang secara mengejutkan diabaikan oleh jawaban yang ada di atas pertanyaan lama ini) adalah bahwa
enum
pernyataan ini mungkin terletak di file header yang dimaksudkan untuk dapat dikompilasi silang karena kode C dan C ++ (yaitu dimasukkan ke dalam Cules implementasi C dan C ++). Seni menulis file header seperti itu bergantung pada kemampuan penulis untuk memilih fitur bahasa yang memiliki arti kompatibel yang tepat dalam kedua bahasa.sumber