我打算使用 BOOST_PP_SEQ_FOR_EACH 为序列的所有变量运行函数:
#include <iostream>
#include <boost/preprocessor.hpp>
#include <boost/preprocessor/seq/for_each.hpp>
#define SEQ (w)(x)(y)(z)
#define MACRO(r, data, elem) foo(#elem);
using namespace std;
void foo(string a) {
cout << a << endl;
}
int main(){
BOOST_PP_SEQ_FOR_EACH(MACRO, ,SEQ) ;
return 0 ;
}
预期输出如下:
w
x
y
z
,而实际结果是:
BOOST_PP_SEQ_HEAD((w)(x)(y)(z))
BOOST_PP_SEQ_HEAD((x)(y)(z))
BOOST_PP_SEQ_HEAD((y)(z))
BOOST_PP_SEQ_HEAD((z))
我不知道扩展会发生什么。我认为 BOOST_PP_SEQ_FOR_EACH 子句扩展为
MACRO(r, ,w) MACRO(r, ,x) MACRO(r, ,y) MACRO(r, ,z)
并且 MACRO(r, ,w) 被扩展为
foo("w");
例如。
BOOST_PP_SEQ_HEAD((a)(b)(c))
是一个宏,用于获取预处理器序列的头部,并将扩展为 a
。但是 #elem
阻止该宏被扩展。
BOOST_PP_STRINGIZE
来展开宏:
#define MACRO(r, data, elem) foo(BOOST_PP_STRINGIZE(elem));