# if и #define MY_MACRO (0)
Использование #if означает, что вы создали макрос «define», то есть что-то, что будет найдено в коде, который будет заменен на «(0)». Это «макро-ад», который я ненавижу видеть в C ++, потому что он загрязняет код потенциальными модификациями кода.
Например:
#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 ++:
main.cpp|408|error: lvalue required as left operand of assignment|
||=== Build finished: 1 errors, 0 warnings ===|
Только одна ошибка.
Это означает, что ваш макрос успешно взаимодействовал с вашим кодом C ++: вызов функции прошел успешно. В этом простом случае это забавно. Но мой собственный опыт работы с макросами в режиме беззвучного воспроизведения моего кода не полон радости и полной реализации, так что ...
# ifdef и #define MY_MACRO
Использование #ifdef означает, что вы «определяете» что-то. Не то, чтобы вы дали ему значение. Он все еще загрязняет окружающую среду, но, по крайней мере, он будет «заменен ничем» и не будет восприниматься кодом C ++ как оператор с задержкой. Тот же код выше, с простым определением, это:
#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;
}
Выдает следующие предупреждения:
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 ===|
Итак ...
Заключение
Я бы предпочел жить без макросов в моем коде, но по нескольким причинам (определение защиты заголовков или отладка макросов) я не могу.
Но, по крайней мере, мне нравится делать их как можно менее интерактивными с моим легитимным кодом C ++. Это означает использование #define без значения, использование #ifdef и #ifndef (или даже #if, определенный в соответствии с предложением Джима Бака), и, самое главное, присвоение им имен настолько длинных и чужих, что никто в здравом уме не использует это "случайно", и это никоим образом не повлияет на законный код C ++.
Post Scriptum
Теперь, когда я перечитываю свой пост, мне интересно, не стоит ли мне пытаться найти какое-то значение, которое никогда не будет правильным C ++ для добавления в мое определение. Что-то вроде
#define MY_MACRO @@@@@@@@@@@@@@@@@@
, который может использоваться с #ifdef и #ifndef, но не позволяет скомпилировать код, если используется внутри функции ... Я успешно попытался это сделать на g ++, и он выдал ошибку:
main.cpp|410|error: stray ‘@’ in program|
Интересно.
: -)