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?
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?
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.
Ini identik dengan mengomentari blok, kecuali dengan satu perbedaan penting: Bersarang tidak menjadi masalah. Pertimbangkan kode ini:
foo();
bar(x, y); /* x must not be NULL */
baz();
Jika saya ingin berkomentar, saya mungkin mencoba:
/*
foo();
bar(x, y); /* x must not be NULL */
baz();
*/
Bzzt. Kesalahan sintaks! Mengapa? Karena komentar blok tidak bersarang, sehingga (seperti yang Anda lihat dari penyorotan sintaks SO) kata */
setelah "NULL" mengakhiri komentar, membuat baz
panggilan tidak dikomentari, dan */
setelah baz
kesalahan sintaks. Di samping itu:
#if 0
foo();
bar(x, y); /* x must not be NULL */
baz();
#endif
Berfungsi untuk mengomentari semuanya. Dan #if 0
s akan bersarang satu sama lain, seperti ini:
#if 0
pre_foo();
#if 0
foo();
bar(x, y); /* x must not be NULL */
baz();
#endif
quux();
#endif
Meskipun tentu saja ini bisa sedikit membingungkan dan menjadi sakit kepala pemeliharaan jika tidak dikomentari dengan benar.
foo.c:3: unterminated string or character constant
dari gcc, apa yang Anda gunakan?
Apa sebenarnya yang dilakukan oleh blok #if 0… #endif?
Ini memberi tahu Anda bahwa penulis jelas belum pernah mendengar tentang sistem kontrol versi. Yang, pada gilirannya, memberitahu Anda untuk lari sejauh mungkin…
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.
#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
:
#if 0
This code will not be compiled
#else
int i = 0;
#endif
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.
Tidak terlalu
int main(void)
{
#if 0
the apostrophe ' causes a warning
#endif
return 0;
}
Ini menunjukkan "tc: 4: 19: peringatan: tidak ada terminating 'karakter" dengan gcc 4.2.4
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:
#ifdef DEBUG
// output to file
#endif
Anda dapat melakukan sesuatu seperti itu dan itu mungkin lebih masuk akal dan yang harus Anda lakukan hanyalah menentukan DEBUG untuk melihat hasilnya.
//
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.