Katakanlah saya ingin memiliki beberapa jenis pesan keluaran dalam kode saya. Salah satunya adalah DEBUG
, yang dicetak saja, ketika kode dikompilasi dalam mode Debug.
Biasanya saya harus menulis sesuatu seperti
#ifdef DEBUG
std::cout << "Debug message" << std::endl;
#endif
yang cukup rumit dan menjengkelkan untuk digunakan di banyak tempat.
Apakah ini praktik yang baik untuk mendefinisikan makro untuk cuplikan kode, jadi Anda akan menggunakannya dengan cara ini?
MSG_DEBUG("Debug message")
Atau ada cara lain yang lebih elegan untuk menghadapinya tanpa makro? Saya tertarik tentang solusi yang mungkin baik dalam C dan C ++, karena saya menggunakan kedua bahasa dalam proyek yang berbeda.
constexpr if
di C ++, misalnya.STDERR
. Juga, mengapa tidak membuatnya bergantungNDEBUG
sepertiassert()
tidak? Kemudian Anda bisa mendefinisikannya seperti#define DEBUG_MSG(MSG) assert(std::cerr << MSG)
, yang menguji kondisi aliran juga.Jawaban:
Tentu, jika Anda tidak keberatan menggunakan makro di tempat pertama, maka mendefinisikan yang diparameterisasi daripada terus mengulangi kode kondisional yang sama tentu lebih disukai dengan ukuran pengkodean yang baik.
Haruskah Anda menggunakan makro sama sekali? Dalam pandangan saya Anda harus, karena itu diterima praktik di C, dan solusi makro-kurang akan memerlukan setidaknya sesuatu dijalankan bahkan di luar mode debug. Pemrogram C biasanya akan memilih makro yang sedikit jelek daripada upaya run-time yang tidak perlu setiap saat.
sumber
Ada elemen preferensi pribadi di sini, tetapi di C ++ saya lebih suka melakukan ini di file header:
Sehingga fungsi tersebut diuraikan dalam rilis build, tetapi merupakan fungsi yang tepat dalam debug build sehingga Anda dapat memiliki pemeriksaan tipe yang tepat, pesan kesalahan yang masuk akal, dll. Dan kemampuan untuk menambahkan fungsionalitas lebih lanjut (logging mungkin?) Nanti.
Jelas, Anda juga perlu membungkus definisi yang sesuai dari fungsi dalam
.cpp
file dalam suatu#ifdef _DEBUG
blok.sumber
Jelas, pastikan Anda tidak menginjak pedoman kode yang diberikan oleh tim Anda. Pastikan tidak ada kode lain dalam sistem yang mencoba mencapai fungsi yang sama melalui kondisi umum jika.
sumber