Почему бы не использовать ваш #ifdef NEEDED
также при потенциальном вызове функции?
Кроме того, вы можете использовать блоки.Сначала вы можете объявить блок:
void (^someBlock)(void);
, а затем создать его при необходимости
#ifdef NEEDED
someBlock = ^{
//do something
};
#endif
При его вызове вы можете сделать следующее:
if (someBlock)
someBlock();
Thisне будет вызывать блок, если он не существует.