Сначала немного кода:Вызов функции в качестве аргумента C макросъемки
int counter = 0;
int get_counter() { return counter++; }
#define EVEN_OR_ZERO(cc) ((cc) % 2 == 0 ? (cc) : 0)
int next_even_or_zero = EVEN_OR_ZERO(get_counter());
Этот код может показаться хорошо, но ... Давайте расширить макрос:
int next_even_or_zero = get_counter() % 2 == 0 ? get_counter() : 0;
Как вы можете видеть макрос будет возвращать нечетные числа, что является противоположностью ожидаемому (или желаемому).
Вопрос: Есть ли способ получить эту работу по назначению с помощью макроса? Или регулярная функция - единственный способ пойти?
//This works as wanted
int even_or_zero(int value) { return value % 2 == 0 ? value : 0; }
В C++ или C? Вы использовали оба тега, что очень сложно понять, какой ответ вы хотите. –
В C++, по крайней мере, макро-функции, подобные этому, не являются хорошей идеей. –
Ответ прост: не используйте макрос, если для этого нет веской причины. Этот случай не является одним из них. –