#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|
Цікаво. :-)
#if
, ви також можете використовувати#elif
послідовно, на відміну від#ifdef
. Таким чином, замість того, щоб просто використовувати#define BLAH
, використовувати#define BLAH 1
з#if BLAH
, тощо ...