#if i # zdefiniuj MY_MACRO (0)
Użycie #if oznacza, że utworzyłeś makro „zdefiniuj”, czyli coś, co będzie przeszukiwane w kodzie i zostanie zastąpione przez „(0)”. To jest „piekło makr”, którego nienawidzę widzieć w C ++, ponieważ zanieczyszcza kod potencjalnymi modyfikacjami.
Na przykład:
#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;
}
daje następujący błąd na g ++:
main.cpp|408|error: lvalue required as left operand of assignment|
||=== Build finished: 1 errors, 0 warnings ===|
Tylko jeden błąd.
Oznacza to, że Twoje makro pomyślnie współdziałało z Twoim kodem C ++: wywołanie funkcji powiodło się. W tym prostym przypadku jest to zabawne. Ale moje własne doświadczenie z makrami grającymi po cichu moim kodem nie jest pełne radości i spełnienia, więc ...
#ifdef i #define MY_MACRO
Używanie #ifdef oznacza, że coś „definiujesz”. Nie znaczy to, że nadajesz mu wartość. Nadal zanieczyszcza, ale przynajmniej zostanie „niczym zastąpiony” i nie będzie postrzegany przez kod C ++ jako instrukcja kodu lagitimate. Ten sam kod powyżej, z prostą definicją, to:
#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;
}
Daje następujące ostrzeżenia:
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 ===|
Więc...
Wniosek
Wolałbym żyć bez makr w swoim kodzie, ale z wielu powodów (definiowanie zabezpieczeń nagłówka lub debugowanie makr) nie mogę.
Ale przynajmniej chcę, aby były one jak najmniej interaktywne z moim legalnym kodem C ++. Oznacza to używanie #define bez wartości, używanie #ifdef i #ifndef (lub nawet #if zdefiniowanego zgodnie z sugestią Jima Bucka), a przede wszystkim nadawanie im nazw tak długich i tak obcych, których nikt o zdrowych zmysłach nie użyje jest to przypadek i w żaden sposób nie wpłynie to na legalny kod C ++.
Post Scriptum
Teraz, gdy ponownie czytam mój post, zastanawiam się, czy nie powinienem próbować znaleźć jakiejś wartości, która nigdy nie będzie poprawna C ++ do dodania do mojego zdefiniowania. Coś jak
#define MY_MACRO @@@@@@@@@@@@@@@@@@
który może być użyty z #ifdef i #ifndef, ale nie pozwól na kompilację kodu, jeśli jest używany wewnątrz funkcji ... Próbowałem tego pomyślnie na g ++ i dało to błąd:
main.cpp|410|error: stray ‘@’ in program|
Ciekawy. :-)
#if
, możesz również używać#elif
w spójny sposób, w przeciwieństwie do with#ifdef
. Dlatego zamiast po prostu używać#define BLAH
, używaj#define BLAH 1
z#if BLAH
, itp ...