Untuk menjawab pertanyaan Anda, pikirkan makro apa yang dominan digunakan untuk (Peringatan: kode yang dikompilasi otak).
- Makro digunakan untuk mendefinisikan konstanta simbolik
#define X 100
Ini dapat dengan mudah diganti dengan: const int X = 100;
- Makro digunakan untuk mendefinisikan (pada dasarnya) fungsi agnostik tipe inline
#define max(X,Y) (X>Y?X:Y)
Dalam bahasa apa pun yang mendukung kelebihan fungsi, ini dapat ditiru dengan cara yang jauh lebih aman dengan memiliki fungsi berlebih dari jenis yang benar, atau, dalam bahasa yang mendukung obat generik, dengan fungsi generik. Makro akan dengan senang hati mencoba membandingkan apa pun termasuk pointer atau string, yang mungkin dikompilasi, tetapi hampir pasti bukan yang Anda inginkan. Di sisi lain, jika Anda membuat macro-safe, mereka tidak menawarkan manfaat atau kenyamanan kelebihan fungsi.
- Makro digunakan untuk menentukan pintasan ke elemen yang sering digunakan.
#define p printf
Ini mudah diganti oleh fungsi p()
yang melakukan hal yang sama. Ini cukup terlibat dalam C (mengharuskan Anda untuk menggunakan va_arg()
keluarga fungsi) tetapi dalam banyak bahasa lain yang mendukung sejumlah variabel argumen fungsi, itu jauh lebih sederhana.
Mendukung fitur-fitur ini dalam bahasa daripada dalam bahasa makro khusus lebih sederhana, lebih sedikit kesalahan, dan jauh lebih membingungkan bagi orang lain yang membaca kode. Bahkan, saya tidak bisa memikirkan satu kasus penggunaan untuk makro yang tidak dapat dengan mudah diduplikasi dengan cara lain. Satu- satunya tempat di mana makro benar-benar berguna adalah ketika mereka terikat pada konstruksi kompilasi bersyarat seperti #if
(dll.).
Pada titik itu, saya tidak akan berdebat dengan Anda, karena saya percaya bahwa solusi non-preprosesor untuk kompilasi bersyarat dalam bahasa populer sangat rumit (seperti injeksi bytecode di Jawa). Tetapi bahasa seperti D telah datang dengan solusi yang tidak memerlukan preprosesor dan tidak lebih rumit daripada menggunakan kondisional preprosesor, sementara jauh lebih sedikit rawan kesalahan.