用宏简化C ++代码。错误:粘贴“<”并且“string”不提供有效的预处理令牌

时间:2018-05-04 17:15:44

标签: c++ macros escaping

我正在寻找一种解决方案,如何简化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;\
}

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

  

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

我做错了什么?

1 个答案:

答案 0 :(得分:2)

这是宏,你正在寻找:

#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