Вы должны стараться избегать макросов как можно больше, и тем более, чтобы генерировать различный код в зависимости от определяет. Это первый шаг на пути, который приводит к разрыву ODR и возникновению неопределенного поведения.
В качестве альтернативы, вы можете рассмотреть только писать различные альтернативы, или с использованием шаблонов (в предположении, что функция имеет больше логики, чем простая операция):
template <typename BinaryFunction>
int op(int a, int b, BinaryFunction f) {
return f(a, b);
}
int main() {
std::cout << op(5, 3, std::plus<int>()) << std::endl; // 8
std::cout << op(5, 3, std::multiplies<int>()) << std::endl; // 15
}
Если вы собираетесь следовать по пути макросов , затем рассмотрите возможность уменьшения объема макросов до минимального минимума (т. е. #undef
их, как только они вам не понадобятся), предоставить очень явные и уникальные имена (подумайте над добавлением имени компонента, файла или чего-то подобного, чтобы избежать взаимодействия: #define BINARY_OPERATOR_IMPL_FLAG
намного лучше, чем #define FLAG
, чтобы избежать столкновений имен), а затем следуйте советам в любом из других ответов.
Я думаю, вы имеете в виду '#ifdef FLAG MULT' для второго условия, не так ли? –
Да, спасибо. Я редактировал. – Aslan986
Вы описываете свою цель? Мне любопытно. – Benj