BOOST_PP_SEQ_FOR_EACH宏中使用BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__)) 出错

BOOST_PP_SEQ_FOR_EACH宏中使用BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__)) 出错,BOOST_PP_IIF_0未定义。

具体编译出错信息如下:

/home/vi/git/dos/dnet/./dconfig/dconfig.h: In static member function ‘static std::string dnet1::path_type2_helper::str(dnet1::path_type2)’:
/home/vi/git/dos/dnet/../vbase/vmacro.h:46:9: error: ‘BOOST_PP_IIF_0’ was not declared in this scope
46 | BOOST_PP_SEQ_FOR_EACH(ENUM_EACH_ITEM_DEF, enum_type, BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__)) \
| ^~~~~~~~~~~~~~~~~~~~~
/home/vi/git/dos/dnet/../vbase/vmacro.h:66:5: note: in expansion of macro ‘DEFINE_ENUM_GET_STR’
66 | DEFINE_ENUM_GET_STR(enum_type, __VA_ARGS__)
| ^~~~~~~~~~~~~~~~~~~
/home/vi/git/dos/dnet/./dconfig/dconfig.h:6:5: note: in expansion of macro ‘DEFINE_ENUM’
6 | DEFINE_ENUM(path_type2, a1,a2);
| ^~~~~~~~~~~
/home/vi/git/dos/dnet/../vbase/vmacro.h:44:11: warning: enumeration value ‘a1’ not handled in switch [-Wswitch]
44 | switch(type) \
| ^

原因分析:使用gcc -E 参数对源文件只体系预处理操作,打开生成的宏替换文件发现BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__))这个宏没有被正确替换,在预处理文件中还保持原样了。

导致这个原因是使用时没有包含BOOST_PP_VARIADIC_TO_SEQ这个宏的头文件。

正确使用,需要包含#include <boost/preprocessor/variadic.hpp>

加入后,即可以正确使用了。

不得不说c++语言在宏编程与模板元编程这两个领域的编程出错信息提示处理的跟渣子一样。直接原因总是报:BOOST_PP_IIF_0未定义,我查遍了boost源文件也没看到对BOOST_PP_IIF_0的直接定义。

posted @ 2023-04-14 15:14  元几科技  阅读(57)  评论(0编辑  收藏  举报