Dalam C / C ++
Apa yang terjadi pada kode yang ditempatkan di antara blok #if 0
/ #endif
?
#if 0
//Code goes here
#endif
Apakah kode tersebut dilewati begitu saja dan karena itu tidak dieksekusi?
c-preprocessor
vette982
sumber
sumber
//
mengawali setiap baris dengan atau memulai bagian dengan/*
dan mengakhiri bagian dengan*/
. Masalah dengan teknik terakhir adalah komentar tidak bersarang sehingga pengembang harus memeriksa dan menangani apa pun di*/
antara awal dan akhir.Jawaban:
Tidak hanya tidak dieksekusi, bahkan tidak bisa dikompilasi.
#if
adalah perintah preprocessor, yang dievaluasi sebelum langkah kompilasi sebenarnya. Kode di dalam blok itu tidak muncul di biner yang dikompilasi.Ini sering digunakan untuk menghapus segmen kode sementara dengan tujuan untuk mengaktifkannya kembali nanti.
sumber
Ini identik dengan mengomentari blok, kecuali dengan satu perbedaan penting: Bersarang tidak menjadi masalah. Pertimbangkan kode ini:
Jika saya ingin berkomentar, saya mungkin mencoba:
Bzzt. Kesalahan sintaks! Mengapa? Karena komentar blok tidak bersarang, sehingga (seperti yang Anda lihat dari penyorotan sintaks SO) kata
*/
setelah "NULL" mengakhiri komentar, membuatbaz
panggilan tidak dikomentari, dan*/
setelahbaz
kesalahan sintaks. Di samping itu:Berfungsi untuk mengomentari semuanya. Dan
#if 0
s akan bersarang satu sama lain, seperti ini:Meskipun tentu saja ini bisa sedikit membingungkan dan menjadi sakit kepala pemeliharaan jika tidak dikomentari dengan benar.
sumber
foo.c:3: unterminated string or character constant
dari gcc, apa yang Anda gunakan?Ini secara permanen mengomentari kode itu sehingga kompiler tidak akan pernah mengkompilasinya.
Pembuat kode nanti dapat mengubah #ifdef agar kode tersebut dikompilasi dalam program jika dia mau.
Ini persis seperti kodenya tidak ada.
sumber
Ini memberi tahu Anda bahwa penulis jelas belum pernah mendengar tentang sistem kontrol versi. Yang, pada gilirannya, memberitahu Anda untuk lari sejauh mungkin…
sumber
Saya ingin menambahkan untuk
#else
kasus ini:sumber
Ketika preprocessor melihat #if itu memeriksa apakah token berikutnya memiliki nilai bukan nol. Jika ya, ia menyimpan kode untuk kompilator. Jika tidak, ia akan menghapus kode itu sehingga kompilator tidak pernah melihatnya.
Jika seseorang mengatakan # jika 0 mereka secara efektif mengomentari kode sehingga tidak akan pernah dapat dikompilasi. Anda dapat menganggap ini sama seperti jika mereka meletakkan / * ... * / di sekitarnya. Ini tidak persis sama, tetapi memiliki efek yang sama.
Jika Anda ingin memahami apa yang terjadi secara mendetail, Anda sering dapat melihatnya. Banyak kompiler akan mengizinkan Anda untuk melihat file-file tersebut setelah preprocessor dijalankan. Misalnya, pada Visual C ++, perintah switch / P akan menjalankan preprocessor dan memasukkan hasilnya ke dalam file .i.
sumber
#if WIN32 || __CYGWIN__
tetapi ini berfungsi seperti yang diharapkan.Baris yang diawali dengan a
#
adalah arahan preprocessor .#if 0 [...] #endif
blok tidak sampai ke kompiler dan tidak akan menghasilkan kode mesin.Anda dapat mendemonstrasikan apa yang terjadi dengan preprocessor dengan file sumber
ifdef.cxx
:Berjalan
gcc -E ifdef.cxx
akan menunjukkan kepada Anda apa yang telah dikompilasi.Anda dapat memilih untuk menggunakan mekanisme ini untuk mencegah blok kode dikompilasi selama siklus pengembangan, tetapi Anda mungkin tidak ingin memeriksanya ke kontrol sumber karena hanya menambahkan cruft ke kode Anda dan mengurangi keterbacaan. Jika itu adalah bagian kode sejarah yang telah dikomentari, maka itu harus dihapus: kontrol sumber berisi riwayatnya, bukan?
Juga, jawabannya mungkin sama untuk C dan C ++ tetapi tidak ada bahasa yang disebut C / C ++ dan itu bukan kebiasaan yang baik untuk merujuk ke bahasa seperti itu.
sumber
Tidak terlalu
Ini menunjukkan "tc: 4: 19: peringatan: tidak ada terminating 'karakter" dengan gcc 4.2.4
sumber
Ini adalah cara yang murah untuk berkomentar, tetapi saya curiga itu bisa memiliki potensi debugging. Misalnya, Anda memiliki build yang menghasilkan nilai ke file. Anda mungkin tidak menginginkannya dalam versi final sehingga Anda dapat menggunakan #if 0 ... #endif.
Juga, saya menduga cara yang lebih baik untuk melakukannya untuk tujuan debug adalah dengan melakukan:
Anda dapat melakukan sesuatu seperti itu dan itu mungkin lebih masuk akal dan yang harus Anda lakukan hanyalah menentukan DEBUG untuk melihat hasilnya.
sumber