此定义已修复,我无法更改(第三方库)

#define X_ERR_OK (0)
#define X_ERR_FOO (816)
#define X_ERR_OTHER (842)
// .. and more

有一个小函数,它返回错误代码的名称(我的代码,我可以更改它)
#define X_ERR_CASE( e ) case e: return #e
const char* err_name( int err ) {
    switch( err ) {
    X_ERR_CASE( X_ERR_OK );
    X_ERR_CASE( X_ERR_FOO );
    X_ERR_CASE( X_ERR_OTHER );
    }
    return "<unknown>";
}

这可行。现在,我发现boost.preprocessor是一个智能库,并尝试使用它:
#define XX_ERR_CASE( r, _, e ) case e: return BOOST_PP_STRINGIZE(e);
#define XX_ERRORS( seq ) \
    const char* err_name2( int err ) { \
        switch( err ) { \
        BOOST_PP_SEQ_FOR_EACH( XX_ERR_CASE, _, seq ) \
        } \
        return "<unknown>";  }

XX_ERRORS(
    (X_ERR_OK)
    (X_ERR_FOO)
    (X_ERR_OTHER)
)

但这不起作用,因为输出不是定义的名称,而是数字。例如,我想要:X_ERR_FOO,但我得到(816)
如果我将XX_ERR_CASE更改为
#define XX_ERR_CASE( r, _, e ) case e: return #e;

我得到BOOST_PP_SEQ_HEAD(((816)) ((842)) (nil))
我如何获得X_ERR_FOO调用err_name(816)

最佳答案

我怀疑这是否可以接受,但是无论如何我都会添加它。使用这种方法,您需要更改调用XX_ERRORS的方式,需要删除其参数的X_前缀。

#include <iostream>
#include <boost/preprocessor.hpp>

#define X_ERR_OK (0)
#define X_ERR_FOO (816)
#define X_ERR_OTHER (842)


#define XX_ERR_CASE( r, _, e ) case BOOST_PP_CAT(X_,e): return "X_" BOOST_PP_STRINGIZE(e);
#define XX_ERRORS( seq ) \
    const char* err_name2( int err ) { \
        switch( err ) { \
        BOOST_PP_SEQ_FOR_EACH( XX_ERR_CASE, _, seq ) \
        } \
        return "<unknown>";  }

XX_ERRORS(
    (ERR_OK)
    (ERR_FOO)
    (ERR_OTHER)
)

int main()
{
    std::cout << err_name2(816) << std::endl;
}

关于c++ - boost.preprocessor中定义的常量的名称,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22045287/

10-12 16:02