Saya ingin tahu apakah typedef
dan #define
apakah samac?
124
Tidak.
#define
adalah token preprocessor: kompilator itu sendiri tidak akan pernah melihatnya.
typedef
adalah token compiler: preprocessor tidak mempedulikannya.
Anda dapat menggunakan salah satu untuk mendapatkan efek yang sama, tetapi lebih baik menggunakan yang tepat untuk kebutuhan Anda
#define MY_TYPE int
typedef int My_Type;
Ketika segala sesuatunya menjadi "berbulu", menggunakan alat yang tepat membuatnya menjadi benar
#define FX_TYPE void (*)(int)
typedef void (*stdfx)(int);
void fx_typ(stdfx fx); /* ok */
void fx_def(FX_TYPE fx); /* error */
stdfx
, objek yang valid dari tipe tersebut adalah pointer ke fungsi yang menerima int dan tidak mengembalikan nilai.void fx_def(void (*)(int) fx);
; deklarasi yang benar adalahvoid fx_def(void (*fx)(int));
.#define FX_TYPE(f) void (*f)(int)
. Anda kemudian akan mendeklarasikan fungsi Anda sebagai:void fx_def(FX_TYPE(fx));
typedef
mematuhi aturan pelingkupan seperti variabel, sedangkandefine
tetap valid hingga akhir unit kompilasi (atau hingga cocokundef
).Juga, beberapa hal dapat dilakukan dengan
typedef
yang tidak dapat dilakukandefine
.Sebagai contoh:
sumber
Tidak, mereka tidak sama. Sebagai contoh:
Setelah praproses, garis itu meluas ke
Semoga Anda melihat masalahnya; hanya
a
akan memiliki tipeint *
;b
akan dideklarasikan sebagai polosint
(karena*
terkait dengan deklarator, bukan penentu tipe).Bandingkan itu dengan
Dalam hal ini, keduanya
a
danb
akan memiliki tipeint *
.Ada seluruh kelas typedef yang tidak bisa ditiru dengan makro preprocessor, seperti pointer ke fungsi atau array:
Coba lakukan itu dengan makro praprosesor.
sumber
#define mendefinisikan makro.
typedef mendefinisikan tipe.
Sekarang mengatakan itu, berikut adalah beberapa perbedaan:
Dengan #define, Anda dapat menentukan konstanta yang dapat digunakan dalam waktu kompilasi. Konstanta dapat digunakan dengan #ifdef untuk memeriksa bagaimana kode dikompilasi, dan mengkhususkan kode tertentu sesuai dengan parameter kompilasi.
Anda juga dapat menggunakan #define untuk mendeklarasikan fungsi Makro temukan-dan-ganti miniatur .
typedef dapat digunakan untuk memberikan alias pada tipe (yang mungkin bisa Anda lakukan dengan #define juga), tetapi lebih aman karena sifat konstanta #define yang temukan dan ganti .
Selain itu, Anda dapat menggunakan deklarasi maju dengan typedef yang memungkinkan Anda mendeklarasikan tipe yang akan digunakan, tetapi belum ditautkan ke file yang Anda tulis.
sumber
Makro preprocessor ("
#define
's") adalah alat pengganti leksikal a la "search and replace". Mereka sepenuhnya agnostik dari bahasa pemrograman dan tidak memahami apa yang Anda coba lakukan. Anda dapat menganggap mereka sebagai mekanik salin / tempel yang dimuliakan - terkadang itu berguna, tetapi Anda harus menggunakannya dengan hati-hati.Typedefs adalah fitur bahasa C yang memungkinkan Anda membuat alias untuk tipe. Ini sangat berguna untuk membuat tipe gabungan yang rumit (seperti struct dan pointer fungsi) dapat dibaca dan diatur (dalam C ++ bahkan ada situasi di mana Anda harus mengetikkan sebuah tipe).
Untuk (3): Anda harus selalu lebih memilih fitur bahasa daripada makro praprosesor jika memungkinkan! Jadi selalu gunakan typedef untuk tipe, dan nilai konstan untuk konstanta. Dengan begitu, kompilator benar-benar dapat berinteraksi dengan Anda secara berarti. Ingatlah bahwa kompilator adalah teman Anda, jadi Anda harus memberitahukannya sebanyak mungkin. Makro preprocessor melakukan kebalikannya dengan menyembunyikan semantik Anda dari compiler.
sumber
Mereka sangat berbeda, meskipun mereka sering digunakan untuk mengimplementasikan tipe data khusus (yang saya asumsikan adalah pertanyaan ini).
Seperti yang disebutkan pmg,
#define
ditangani oleh pra-prosesor (seperti operasi potong-dan-tempel) sebelum kompilator melihat kode, dantypedef
diinterpretasikan oleh kompilator.Salah satu perbedaan utama (setidaknya dalam hal mendefinisikan tipe data) adalah
typedef
memungkinkan pemeriksaan tipe yang lebih spesifik. Sebagai contoh,Di sini, compiler melihat variabel x sebagai int, tetapi variabel y sebagai tipe data yang disebut 'tdType' yang ukurannya sama dengan int. Jika Anda menulis fungsi yang mengambil parameter tipe defType, pemanggil bisa meneruskan int normal dan kompilator tidak akan tahu bedanya. Jika fungsi tersebut mengambil parameter tipe tdType, compiler akan memastikan bahwa variabel dengan tipe yang tepat digunakan selama panggilan fungsi.
Selain itu, beberapa debugger memiliki kemampuan untuk menangani
typedef
s, yang bisa jauh lebih berguna daripada mencantumkan semua tipe kustom sebagai tipe primitif yang mendasarinya (seperti yang akan terjadi jika#define
digunakan sebagai gantinya).sumber
Tidak.
Typedef adalah kata kunci C yang membuat alias untuk suatu tipe.
#define adalah instruksi pra-prosesor, yang membuat peristiwa penggantian teks sebelum kompilasi. Ketika kompilator mendapatkan kode tersebut, kata "#defined" asli tidak ada lagi. #define sebagian besar digunakan untuk makro dan konstanta global.
sumber
AFAIK, Tidak.
typedef
membantu Anda menyiapkan "alias" untuk tipe data yang ada. Misalnya.typedef char chr
;#define
adalah arahan preprocessor yang digunakan untuk mendefinisikan makro atau substitusi pola umum. Misalnya.#define MAX 100
, gantikan semua kemunculanMAX
dengan 100sumber
Seperti disebutkan di atas, ada perbedaan utama antara
#define
dan typedef. Cara yang tepat untuk memikirkannya adalah dengan melihat typedef sebagai tipe "dikemas" yang lengkap. Artinya Anda tidak dapat menambahkannya setelah Anda mendeklarasikannya.Anda bisa memperluas nama jenis makro dengan penentu jenis lain, tapi bukan nama jenis yang diketik:
Selain itu, nama typedef menyediakan tipe untuk setiap deklarasi dalam deklarasi.
Setelah ekspansi makro, baris kedua menjadi:
Apel adalah penunjuk ke int, sedangkan banana adalah int. Dibandingkan. seorang typedef seperti ini:
menyatakan apel dan pisang sama. Nama di depan berbeda, tetapi keduanya mengarah ke karakter.
sumber
Seperti yang dikatakan semua orang di atas, mereka tidak sama. Sebagian besar jawaban menunjukkan
typedef
lebih menguntungkan daripada#define
. Tapi izinkan saya memberi nilai tambah#define
:ketika kode Anda sangat besar, tersebar di banyak file, lebih baik digunakan
#define
; itu membantu dalam keterbacaan - Anda cukup memproses semua kode untuk melihat definisi tipe sebenarnya dari variabel di tempat deklarasinya sendiri.sumber