在#define宏中嵌入if语句

Mik*_*ike 0 c++ c-preprocessor

我正在阅读一篇文章,其中#define宏是这样制作的:

#define TEST(level) if (level > 2) ; else std::cout
Run Code Online (Sandbox Code Playgroud)

然后可以在代码中使用,如下所示:

Test(1) << 3;
Test(3) << 4;
Run Code Online (Sandbox Code Playgroud)

我的印象是,如果你写的

TEST(1)
Run Code Online (Sandbox Code Playgroud)

它将取代它:

std::cout
Run Code Online (Sandbox Code Playgroud)

TEST(3)
Run Code Online (Sandbox Code Playgroud)

将被替换为空字符串(在代码文件中).但是,如果它以这种方式工作,那么它应该抛出一个错误,因为

<< 3;
Run Code Online (Sandbox Code Playgroud)

是无效的.

这个宏实际上如何工作?以及预处理器如何变化

TEST(3) << 3;
Run Code Online (Sandbox Code Playgroud)

所以它不输出任何东西(也就是代码不运行)

Adr*_*hum 5

我相信你弄错了:

因为TEST(3) << 3,被替换的形式是:

if (3 > 2) ; else std::cout << 3
Run Code Online (Sandbox Code Playgroud)

它仍然是一个有效的表达