Встроенный оператор if в макросе #define
Я читал статью, где макрос #define был сделан так:
#define TEST(level) if (level > 2) ; else std::cout
который затем может быть использован в коде так:
Test(1) << 3;
Test(3) << 4;
У меня сложилось впечатление, что если вы написали
TEST(1)
это заменит его на:
std::cout
а также
TEST(3)
будет заменен пустой строкой (в файле кода). Однако, если это работает таким образом, то должно выдать ошибку, так как
<< 3;
является недействительным.
Как этот макрос на самом деле работает? и как меняется препроцессор
TEST(3) << 3;
так что ничего не выводится (то есть код не запускается)
2 ответа
Решение
Я полагаю, вы ошиблись
За TEST(3) << 3
замененная форма:
if (3 > 2) ; else std::cout << 3
Это все еще действительное выражение
Это замена TEST(x)
с;
if (x > 2)
// do nothing
else
std::cout << x
Препроцессор заменяет весь текст, то есть вы получаете весь if-else
Это также можно записать как
#define TEST(x) if (!x > 2) std::cout