0

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

使其不输出任何东西(即代码不运行)

4

2 回答 2

5

我相信你错了:

对于TEST(3) << 3,替换后的形式为:

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

它仍然是一个有效的表达式

于 2012-11-15T04:18:41.027 回答
1

它正在替换TEST(x)为;

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

预处理器替换所有文本,这意味着你得到了整个 if-else

这也可以写成

#define TEST(x) if (!x > 2) std::cout
于 2012-11-15T04:19:20.210 回答