宏定义中的转义结构字段

时间:2019-01-07 07:31:28

标签: c macros c-preprocessor

我具有以下结构(简化):

struct error_t{
    const char *file;
    const char *error_desc;
};

我写了一个宏来创建结构

#define ERROR_SET(error_desc) \
{ \
   struct error_t tmp = {.error_desc = error_desc, .file = __FILE__}; \
   struct error_t *ptr = malloc(sizeof(*ptr)); \
   memcpy(ptr, &tmp, sizeof(tmp)); \
   *error_ptr = ptr; \
}

问题是在线上

struct error_t tmp = {.error_desc = error_desc, .file = __FILE__}

error_desc.error_desc = error_desc都被替换了,这不是我想要的。我看到的唯一解决方案是将宏功能参数从error_desc重命名为_error_desc,但是也许有更好的方法。也许我们可以对error_desc进行“转义”以替换到.error_desc中?

3 个答案:

答案 0 :(得分:3)

请不要为参数和struct成员使用相同的名称

答案 1 :(得分:2)

您可以使用其他MACRO,将预处理器替换为func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) { //recast your view as a UITableViewHeaderFooterView print("will display header view") let header: UITableViewHeaderFooterView = view as! UITableViewHeaderFooterView header.contentView.backgroundColor = UIColor.colorWithHexString(hexStr: "#408000").withAlphaComponent(0.2) }

error_desc

然后您可以像这样定义#define ERROR_DESC error_desc

ERROR_SET

这有效,因为替换仅执行一次。

答案 2 :(得分:1)

您可以使用

之类的东西来“欺骗”预处理器。
  construct_CDFG(ast, CDFGS, clks, 2)
  for CDFG in CDFGS:
    cdfg_type = CDFG.node[CDFG.nodes()[0]]['typ']
    if cdfg_type == 'Always':
        cdfg_ast =  CDFG.node[CDFG.nodes()[0]]['ast']
        add_nodes_to_CDFG(cdfg_ast, CDFG)

但这是不值得的。只需重命名参数即可。并制定参数命名约定,以帮助您避免将来发生此类命名冲突。


再三考虑,甚至不需要多余的Traceback (most recent call last): File "/home/user/Documents/src/tool.py", line 150, in <module> = CDFG(ast, temporal_depth, targets, clks, Params) File "/home/user/Documents/src/sa.py", line 477, in CDFG cdfg_type = CDFG.node[CDFG.nodes()[0]]['typ'] File "/usr/local/lib/python2.7/dist-packages/networkx/classes/reportviews.py", line 178, in __getitem__ return self._nodes[n] KeyError: 0 宏。这样可以达到相同的目的

#define CONCAT(a, b) a##b

#define ERROR_SET(error_desc) \
{ \
   struct error_t tmp = { .CONCAT(error,_desc) = error_desc, .file = __FILE__ }; \
   ...\
}