#if ve # tanımla MY_MACRO (0)
#İf kullanılması, bir "tanımla" makrosu oluşturduğunuz anlamına gelir, yani kodda "(0)" ile değiştirilecek bir şey aranır. Bu, C ++ 'da görmekten nefret ettiğim "makro cehennemi", çünkü kodu potansiyel kod değişiklikleriyle kirletiyor.
Örneğin:
#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;
}
g ++ üzerinde şu hatayı verir:
main.cpp|408|error: lvalue required as left operand of assignment|
||=== Build finished: 1 errors, 0 warnings ===|
Yalnızca bir hata.
Bu, makronuzun C ++ kodunuzla başarılı bir şekilde etkileşime girdiği anlamına gelir: İşleve yapılan çağrı başarılı oldu. Bu basit durumda, eğlenceli. Ancak, kodumla sessizce oynayan makrolarla ilgili kendi deneyimim neşe ve eksiksizlik dolu değil, bu yüzden ...
#ifdef ve #define MY_MACRO
#İfdef kullanmak, bir şeyi "tanımladığınız" anlamına gelir. Ona bir değer verdiğinden değil. Hala kirletiyor, ancak en azından "hiçbir şeyle değiştirilecek" ve C ++ kodu tarafından gecikmeli kod ifadesi olarak görülmeyecek. Yukarıdaki aynı kod, basit bir tanımla:
#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;
}
Aşağıdaki uyarıları verir:
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 ===|
Yani...
Sonuç
Kodumda makrolar olmadan yaşamayı tercih ederim, ancak birden çok nedenden dolayı (başlık korumalarını tanımlamak veya makrolarda hata ayıklamak) yapamam.
Ama en azından, meşru C ++ kodumla onları mümkün olan en az etkileşimli hale getirmeyi seviyorum. Bu, #define'ı değer olmadan kullanmak, #ifdef ve #ifndef kullanmak (veya Jim Buck tarafından önerildiği gibi # ise) ve hepsinden önemlisi, onlara çok uzun ve çok yabancı isimler vermek anlamına gelir. "tesadüfen" ve yasal C ++ kodunu hiçbir şekilde etkilemeyecek.
Yazı Yazısı
Şimdi, yazımı yeniden okurken, tanımıma eklemek için hiçbir zaman doğru C ++ olmayacak bir değer bulmaya çalışmamalı mıyım merak ediyorum. Gibi bir şey
#define MY_MACRO @@@@@@@@@@@@@@@@@@
#ifdef ve #ifndef ile kullanılabilir, ancak bir işlev içinde kullanıldığında kodun derlenmesine izin verilmez ... Bunu g ++ üzerinde başarıyla denedim ve hata verdi:
main.cpp|410|error: stray ‘@’ in program|
İlginç. :-)
#if
,#elif
ile aksine, tutarlı bir şekilde de kullanabilirsiniz#ifdef
. Böylece, bunun yerine sadece kullanmanın#define BLAH
kullanımı,#define BLAH 1
ile#if BLAH
... vs,