#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);
    }
}
→ Ссылка