Adapun banyak pertanyaan, jawaban dari pertanyaan ini tergantung . Alih-alih mengatakan mana yang lebih baik saya lebih suka memberikan contoh dan tujuan di mana yang satu lebih baik dari yang lain.
Baik preprosesor maupun konstanta memiliki tempat sendiri untuk penggunaan yang sesuai.
Dalam hal pra-prosesor, kode dihapus sebelum waktu kompilasi. Oleh karena itu, paling cocok untuk situasi di mana kode diharapkan tidak dikompilasi . Ini dapat memengaruhi struktur modul, dependensi, dan ini memungkinkan pemilihan segmen kode terbaik untuk aspek kinerja. Dalam kasus-kasus berikut, seseorang harus membagi kode hanya dengan menggunakan preprosesor.
Kode multi-platform:
Misalnya, ketika kode dikompilasi di bawah platform yang berbeda, ketika kode memiliki ketergantungan pada nomor versi OS tertentu (atau bahkan versi kompiler - meskipun ini sangat jarang). Sebagai contoh ketika Anda berurusan dengan rekan-rekan kecil-endien kode besar-endien - mereka harus dipisahkan dengan preprocessor daripada konstanta. Atau jika Anda mengkompilasi kode untuk Windows juga Linux dan panggilan sistem tertentu sangat berbeda.
Patch Eksperimental:
Kasus lain yang membuat ini dibenarkan adalah beberapa kode eksperimental yang berisiko atau modul utama tertentu yang perlu dihilangkan yang akan memiliki hubungan signifikan atau perbedaan kinerja. Alasan mengapa seseorang ingin menonaktifkan kode melalui preprocessor daripada bersembunyi di bawah if () adalah karena kami mungkin tidak yakin bug yang diperkenalkan oleh set perubahan khusus ini dan kami berjalan di bawah dasar eksperimental. Jika gagal, kita harus melakukan apa pun selain menonaktifkan kode itu dalam produksi selain menulis ulang. Beberapa waktu yang ideal untuk digunakan #if 0
untuk mengomentari seluruh kode.
Berurusan dengan dependensi:
Alasan lain di mana Anda mungkin ingin membuat Sebagai contoh, jika Anda tidak ingin mendukung gambar JPEG, Anda dapat membantu menyingkirkan mengkompilasi modul / rintisan itu dan akhirnya perpustakaan tidak akan (secara statis atau dinamis) menautkan itu modul. Kadang-kadang paket dijalankan ./configure
untuk mengidentifikasi ketersediaan ketergantungan tersebut dan jika perpustakaan tidak ada, (atau pengguna tidak ingin mengaktifkan) fungsionalitas tersebut dinonaktifkan secara otomatis tanpa menghubungkan dengan perpustakaan itu. Ini selalu bermanfaat jika arahan ini dibuat secara otomatis.
Perizinan:
Salah satu contoh contoh preprocessor directive yang sangat menarik adalah ffmpeg . Ini memiliki codec yang berpotensi melanggar paten dengan penggunaannya. Jika Anda mengunduh sumber dan kompilasi untuk menginstal, ia menanyakan apakah Anda ingin atau menyimpan hal-hal seperti itu. Menyembunyikan kode di bawah beberapa jika kondisi masih bisa mendarat Anda di pengadilan!
Copy-paste kode:
Aka macro. Ini bukan saran untuk menggunakan makro secara berlebihan - hanya saja makro memiliki cara yang jauh lebih kuat untuk menerapkan padanan salinan di masa lalu . Tapi gunakan dengan hati-hati; dan gunakan jika Anda tahu apa yang Anda lakukan. Konstanta tentu saja tidak dapat melakukan ini. Tetapi seseorang dapat menggunakan inline
fungsi juga jika itu mudah dilakukan.
Jadi kapan Anda menggunakan konstanta?
Hampir di tempat lain.
Aliran kode yang lebih rapi:
Secara umum, ketika Anda menggunakan konstanta, hampir tidak dapat dibedakan dari variabel reguler dan karenanya, itu adalah kode yang lebih mudah dibaca. Jika Anda menulis rutin yaitu 75 baris - memiliki 3 atau 4 baris setelah setiap 10 baris dengan #ifdef SANGAT tidak dapat dibaca . Mungkin diberikan konstanta primer yang diatur oleh #ifdef, dan menggunakannya dalam aliran alami di mana saja.
Kode yang terindentasi dengan baik: Semua arahan preprosesor, tidak pernah bekerja dengan baik dengan kode yang diindentasi dengan baik . Bahkan jika Anda compiler tidak memungkinkan lekukan dari #def, Pre-ANSI C preprocessor tidak memungkinkan untuk ruang antara awal baris dan "#" karakter; "#" yang memimpin harus selalu ditempatkan di kolom pertama.
Konfigurasi:
Alasan lain mengapa konstanta / atau variabel masuk akal adalah bahwa mereka dapat dengan mudah berevolusi dari yang tertaut ke global atau di masa depan dapat diperluas untuk diturunkan dari file konfigurasi.
Satu hal terakhir:
Jangan pernah gunakan arahan preprocessor #ifdef
untuk #endif
melintasi ruang lingkup atau { ... }
. yaitu mulai #ifdef
atau berakhir #endif
pada sisi yang berbeda { ... }
. Ini sangat buruk; itu bisa membingungkan, terkadang berbahaya.
Ini tentu saja, bukan daftar lengkap, tetapi menunjukkan Anda perbedaan nyata, di mana metode mana yang lebih tepat untuk digunakan. Ini tidak benar-benar tentang mana yang lebih baik , itu selalu lebih mana yang lebih alami untuk digunakan dalam konteks tertentu.