我正在阅读一篇文章,其中#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;
因此它不会输出任何内容(即代码不会运行)
答案 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