如何写宏以避免重新定义?

时间:2016-07-30 10:15:00

标签: c c-preprocessor

我有以下宏:

#define my_add_property(ret, name, value) \
  object tmp; \
  tmp = *value; \
  add_property(ret, name, &tmp);

现在我在follow函数中使用宏:

void func() {
  object *ret;
  my_add_property(ret, "key", my_func1());
  my_add_property(ret, "value", my_func2());
}

它将make errortmp被重新定义。

所以我想使用object tmp##name,但如果名称为"key",则tmp##name将为tmp"key"。我应该如何编写使tmp##name成为tmpkey而非tmp"key"的宏?谢谢!

1 个答案:

答案 0 :(得分:4)

您可以在宏中创建一个新范围,这样tmp只能通过将实现包装在do {} while(0)中而在短时间内生效,例如:

#define my_add_property(return, name, value) do { \
  object tmp;                                  \
  tmp = *value;                                \
  add_property(return, name, &tmp); } while(0)