Как я могу создать макрос для генерации этого кода?

Я написал оценщик обратной польской записи, который поддерживает много функций, поэтому у меня есть switch во многих случаях, как этот:

case 'b': {
    if (stack.size() < 1) fail();
    pop(l1, stack);
    l1 = log(l1);
    push(l1, stack);
    break;
}

Для всех функций, требующих одного аргумента, шаблон одинаков, единственное изменение case характер и l1 = ...;, Как я могу создать макрос, который генерирует это case,

1 ответ

Не проверено, но это должно работать:

#define THEMACRO(charfunc, functionname) \
  case charfunc: { \
      if (stack.size() < 1) fail(); \
      pop(l1, stack); \
      l1 = functionname(l1); \
      push(l1, stack); \
      break; \
  } 

Теперь вы можете написать:

THEMACRO('b', log)
THEMACRO('c', someotherfunction)

вместо:

case 'b': {
    if (stack.size() < 1) fail();
    pop(l1, stack);
    l1 = log(l1);
    push(l1, stack);
    break;
}
case 'c': {
    if (stack.size() < 1) fail();
    pop(l1, stack);
    l1 = someotherfunction(l1);
    push(l1, stack);
    break;
}

Но это довольно некрасиво делать с макросами. Я бы сделал это по-другому.

Другие вопросы по тегам