代码之家  ›  专栏  ›  技术社区  ›  Martin Borýsek

用宏简化C++代码。错误:粘贴“<”和“字符串”不会提供有效的预处理标记[重复]

  •  0
  • Martin Borýsek  · 技术社区  · 6 年前

    我正在寻找一个解决方案,如何简化C++代码。

    一个类中有很多类似的方法,我需要在每个方法中检查JSON中的数据类型。复制并粘贴此块,只更改所需的类型(在本例中为“string”)有点笨拙。我的原始和工作代码验证块如下所示

    if(json_data_incomming.get("value").is<string>()){
        __TRACE("argument type OK\n");
    } else {
        __ERROR("invalid type\n");
        _result.rc = ERROR_CODE_INVALID_TYPE;
        _req_done(&_result);
        return;
    }
    

    我的目标是创建如下验证宏:

    JSON_CHECK_TYPE(string)
    

    或:

    JSON_CHECK_TYPE(<string>)
    

    我试图定义concat宏,如下所示:

    #define JSON_CHECK_TYPE(TYPE) if(json_data_incomming.get("value").is<##TYPE##>()){\
        __TRACE("argument type OK\n");\
    } else {\
        __ERROR("invalid type\n");\
        _result.rc = ERROR_CODE_INVALID_TYPE;\
        _req_done(&_result);\
        return;\
    }
    

    但未成功-编译器返回错误:

    错误:粘贴“<”并且“string”不提供有效的预处理标记

    我做错了什么?

    1 回复  |  直到 5 年前
        1
  •  2
  •   Quazar    6 年前

    这是macro,您正在查找:

    #define JSON_CHECK_TYPE(type)                               \
        do {                                                    \
            if(json_data_incomming.get("value").is<type>()){    \
                __TRACE("argument type OK\n");                  \
            } else {                                            \
                __ERROR("invalid type\n");                      \
                _result.rc = ERROR_CODE_INVALID_TYPE;           \
                _req_done(&_result);                            \
                return;                                         \
            }                                                   \
    } while(false)
    

    在此宏中,零件 do { } while(false) 用于实现以下目的:

    if(condition)
        JSON_CHECK_TYPE(string);
    else
        // Do other useful things