#define макрос в зависимости от переданного аргумента
Есть 2 функции:
UnitAddAbility(unit,id)
UnitRemoveAbility(unit,id)
Я бы хотел сделать макрос который в зависимости от переданного аргумента подставит нужную функцию, например так:
#define UnitSetAbility(unit,id,boolean) UnitAddAbility(unit,id)
Чтобы в зависимости от агрумента boolean подставилась нужная функция
true = UnitAddAbility(unit,id)
false = UnitRemoveAbility(unit,id)
Возможно ли как либо это реализовать?
Ответы (1 шт):
Автор решения: Stanislav Volodarskiy
→ Ссылка
Можно прибегнуть к оператору ## для составления имени зависящего от значения параметра:
#include "stdio.h"
#define UnitSetAbility_true(unit, id) UnitAddAbility(unit, id)
#define UnitSetAbility_false(unit, id) UnitRemoveAbility(unit, id)
#define UnitSetAbility(unit, id, boolean) UnitSetAbility_ ## boolean(unit, id)
void UnitAddAbility(int unit, int id) {
printf("UnitAddAbility(%d, %d)\n", unit, id);
}
void UnitRemoveAbility(int unit, int id) {
printf("UnitRemoveAbility(%d, %d)\n", unit, id);
}
int main() {
UnitSetAbility(1, 2, true);
UnitSetAbility(3, 4, false);
}
$ gcc temp.c $ ./a.out UnitAddAbility(1, 2) UnitRemoveAbility(3, 4)
Но зачем это делать? Компилятор выполнит все эти оптимизации без помощи препроцессора, если у него будет такое определение:
void UnitSetAbility(int unit, int id, bool set) {
if (set) {
UnitAddAbility(unit, id);
} else {
UnitRemoveAbility(unit, id);
}
}