#if и #define MY_MACRO (0)
Использование #if означает, что вы создали макрос «определить», т. Е. Что-то, что будет искать в коде и заменить на «(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 ++.
Пост скриптум
Теперь, когда я перечитываю свой пост, мне интересно, не стоит ли мне пытаться найти какое-то значение, которое никогда не будет правильным C ++, чтобы добавить к моему определению. Что-то вроде
#define MY_MACRO @@@@@@@@@@@@@@@@@@
который можно использовать с #ifdef и #ifndef, но не позволять коду компилироваться, если он используется внутри функции ... Я успешно попробовал это на g ++, и он дал ошибку:
main.cpp|410|error: stray ‘@’ in program|
Интересный. :-)
#if
, вы также можете использовать#elif
последовательно, в отличие от с#ifdef
. Таким образом, вместо того, чтобы просто использовать#define BLAH
, использовать#define BLAH 1
с#if BLAH
и т. Д.