#if dan #define MY_MACRO (0)
Menggunakan #if berarti Anda membuat makro "definisikan", yaitu sesuatu yang akan dicari di kode untuk diganti dengan "(0)". Ini adalah "neraka makro" yang saya benci untuk dilihat di C ++, karena mencemari kode dengan kemungkinan modifikasi kode.
Sebagai contoh:
#define MY_MACRO (0)
int doSomething(int p_iValue)
{
return p_iValue + 1 ;
}
int main(int argc, char **argv)
{
int MY_MACRO = 25 ;
doSomething(MY_MACRO) ;
return 0;
}
memberikan kesalahan berikut pada g ++:
main.cpp|408|error: lvalue required as left operand of assignment|
||=== Build finished: 1 errors, 0 warnings ===|
Hanya satu kesalahan.
Artinya makro Anda berhasil berinteraksi dengan kode C ++ Anda: Panggilan ke fungsi berhasil. Dalam kasus sederhana ini, itu lucu. Tetapi pengalaman saya sendiri dengan makro yang bermain diam-diam dengan kode saya tidak penuh dengan kegembiraan dan kepenuhan, jadi ...
#ifdef dan #define MY_MACRO
Menggunakan #ifdef berarti Anda "mendefinisikan" sesuatu. Bukan berarti Anda memberinya nilai. Itu masih mencemari, tapi setidaknya, itu akan "digantikan oleh tidak ada", dan tidak dilihat oleh kode C ++ sebagai pernyataan kode yang tertinggal. Kode yang sama di atas, dengan definisi sederhana, itu:
#define MY_MACRO
int doSomething(int p_iValue)
{
return p_iValue + 1 ;
}
int main(int argc, char **argv)
{
int MY_MACRO = 25 ;
doSomething(MY_MACRO) ;
return 0;
}
Memberikan peringatan berikut:
main.cpp||In function ‘int main(int, char**)’:|
main.cpp|406|error: expected unqualified-id before ‘=’ token|
main.cpp|399|error: too few arguments to function ‘int doSomething(int)’|
main.cpp|407|error: at this point in file|
||=== Build finished: 3 errors, 0 warnings ===|
Begitu...
Kesimpulan
Saya lebih suka hidup tanpa makro dalam kode saya, tetapi karena beberapa alasan (mendefinisikan pelindung header, atau makro debug), saya tidak bisa.
Tapi setidaknya, saya ingin membuatnya menjadi paling tidak interaktif dengan kode C ++ saya yang sah. Yang berarti menggunakan #define tanpa nilai, menggunakan #ifdef dan #ifndef (atau bahkan #if didefinisikan seperti yang disarankan oleh Jim Buck), dan yang terpenting, memberi mereka nama yang begitu lama dan begitu asing sehingga tidak ada orang waras yang akan menggunakannya itu "secara kebetulan", dan tidak akan mempengaruhi kode C ++ yang sah.
Posting Scriptum
Sekarang, saat saya membaca kembali posting saya, saya bertanya-tanya apakah saya seharusnya tidak mencoba menemukan beberapa nilai yang tidak akan pernah menjadi C ++ yang benar untuk ditambahkan ke definisi saya. Sesuatu seperti
#define MY_MACRO @@@@@@@@@@@@@@@@@@
yang dapat digunakan dengan #ifdef dan #ifndef, tetapi tidak membiarkan kode dikompilasi jika digunakan di dalam suatu fungsi ... Saya mencoba ini dengan sukses di g ++, dan itu memberikan kesalahan:
main.cpp|410|error: stray ‘@’ in program|
Menarik. :-)
#if
, Anda juga dapat menggunakan#elif
secara konsisten, tidak seperti dengan#ifdef
. Jadi, alih-alih hanya menggunakan#define BLAH
, gunakan#define BLAH 1
dengan#if BLAH
, dll ...