在#define宏中嵌入if语句

时间:2012-11-15 04:15:10

标签: c++ c-preprocessor

我正在阅读一篇文章,其中#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 个答案:

答案 0 :(得分:5)

我相信你弄错了:

对于TEST(3) << 3,替换后的表单为:

if (3 > 2) ; else std::cout << 3

它仍然是一个有效的表达

答案 1 :(得分:1)

它正在替换TEST(x);

 if (x > 2)
    // do nothing
 else
    std::cout << x

预处理器会替换所有文本,这意味着您将获得整个if-else

这也可以写成

#define TEST(x) if (!x > 2) std::cout