我具有以下结构(简化):
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
中?
答案 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__ }; \
...\
}