阅读一些 C++ 代码时,我遇到了我称之为函数宏的“函数式”使用,大致如下(这是一个完全程式化的例子来说明这一点):
#define TOP_LEVEL(ARG1) \
ARG1("foo1","bar1") \
ARG1("foo2","bar2")
#define NEXT_LEVEL(ARG2A, ARG2B) \
cout << ARG2A << " and " << ARG2B;
TOP_LEVEL(NEXT_LEVEL)
我对这门语言比较陌生,起初我无法弄清楚这一点,但后来我只通过预处理器 ( g++ -E
) 运行它,你瞧,它解析为:
cout << "foo1" << " and " << "bar1"; cout << "foo2" << " and " << "bar2";
你看到它在那里做了什么吗?它将宏 NEXT_LEVEL像函数指针一样传递给宏 TOP_LEVEL。看到这可能有多么有用,我想了解更多关于它的信息:将函数传递给其他函数是非常复杂的东西,至少必须对这项技术多说些什么。
然而,尽管进行了大量的谷歌搜索,但我找不到任何证据证明预处理器的这个功能甚至存在,更不用说任何接近文档的东西了: here、here、here和here只是跳过这个的宏教程的四个示例;最后一个甚至有一个名为“高级宏技巧”的部分 - 这肯定符合条件!?
(请注意,这与简单地以另一个评估的函数宏作为参数调用函数宏完全不同- FOO(BAR(2)) 更直接。)
我的问题是:
- 这种行为有实际名称吗?
- 它在任何地方都有记录吗?
- 它是常用的,还是有众所周知的陷阱等?