Встроенный оператор 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
Другие вопросы по тегам