BOOST_PP_SEQ_FOR_EACH遍历序列执行函数用法及展开异常排查
问题成因
你遇到的展开异常核心原因是调用BOOST_PP_SEQ_FOR_EACH时传入了空的data参数:代码里写的BOOST_PP_SEQ_FOR_EACH(MACRO, ,SEQ)中,两个逗号之间没有任何内容,属于空宏参数。
Boost.Preprocessor 为了兼容不支持空宏参数的老旧预处理器(C99标准前的编译器、部分旧版本MSVC等),不允许data位置留空。参数解析失败后,BOOST_PP_SEQ_FOR_EACH内部的递归展开逻辑会直接中断,你看到的BOOST_PP_SEQ_HEAD(...)输出就是库遍历序列时的中间状态,没有完成后续的替换展开。
你对这个宏展开逻辑的理解本身没有问题:参数传递正确的前提下,BOOST_PP_SEQ_FOR_EACH确实会展开为对每个序列元素调用MACRO的代码,最终生成foo("w"); foo("x"); foo("y"); foo("z");语句。
修复方法
只需要给data参数传入一个非空占位值即可,哪怕你在自定义的MACRO里完全不使用这个参数,最常用的占位符是_。
修正后的完整可运行代码:
#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
内容的提问来源于stack exchange,提问作者roy.atlas
相关产品推荐
相关产品推荐

