2015-05-03 4 views
1

Сначала немного кода:Вызов функции в качестве аргумента 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; } 
+2

В C++ или C? Вы использовали оба тега, что очень сложно понять, какой ответ вы хотите. –

+2

В C++, по крайней мере, макро-функции, подобные этому, не являются хорошей идеей. –

+6

Ответ прост: не используйте макрос, если для этого нет веской причины. Этот случай не является одним из них. –

ответ

0

Сделайте две функции.

int getCurrentCounter() { ... } // just return here 
int getNextCounter() { ... } // increment here 

Это как - в примере - последовательности - это работа PSQL.


Кроме того, это похоже на очень плохой дизайн кода.

  • не использовать макросы в C++, есть более лучшие способы достичь того, что вы хотите (Usally) без их использования
  • функции с побочными эффектами на глобальном переменных не так хороши. Подумайте, не будет ли лучше создавать struct/class со своим счетчиком и добавлять к нему методы. Или еще лучше, можно скрыть методы, как принести в set methods/class, так как их друзья ограничивают, кто может повлиять на счетчик.
3
#define EVEN_OR_ZERO(cc) even_or_zero(cc) 

Это может быть идеальным ответом или плохая шутка, в зависимости от того, почему вам нужен макрос, который вы не сказали нам.

1

Ответ прост: не используйте макрос, если для этого нет веской причины. Этот случай не является одним из них:

int even_or_zero(int i) { 
    if (i % 2) { 
     return 0; 
    } else { 
     return i; 
    } 
} 
+0

... встроенные функции - это билет здесь (предполагая C++) –

Смежные вопросы