【问题标题】:Simplify C++ code with macro. Error: pasting "<" and "string" does not give a valid preprocessing token [duplicate]使用宏简化 C++ 代码。错误:粘贴“<”和“字符串”未提供有效的预处理令牌 [重复]
【发布时间】:2018-05-04 17:15:44
【问题描述】:

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

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

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;\
}

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

错误:粘贴“

我做错了什么?

【问题讨论】:

  • 真的有必要使用宏吗?可以用函数替换宏吗?
  • is&lt;##TYPE##&gt; -> is&lt;TYPE&gt;
  • 在 C++ 中遇到语法问题时,您可能会想“我知道,我会用宏解决它!”现在你有两个问题。
  • 以下划线后跟大写字母或包含双下划线的标识符为系统保留。
  • 使用模板。

标签: c++ macros escaping


【解决方案1】:

这里是宏,你要找的:

#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

【讨论】:

  • 所以在我的解决方案中,与 ## 连接是不必要的。与 do/while 分开只是一点点好处。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-24
相关资源
最近更新 更多