Программирование на C: вызов функции с помощью макросов - PullRequest
0 голосов
/ 14 ноября 2011

Я хочу вызвать другую функцию из функции с задействованными макросами.

Вот пример:

#if RAND
int functionA() {

  //How to call the bottom function from here?
}


#else
int functionA() {


}

Обратите внимание, что они являются одинаковыми именами функций.Как мне вызвать функцию 'else' из функции 'if'.

Спасибо

Ответы [ 5 ]

3 голосов
/ 14 ноября 2011

Это бессмысленно и невозможно.Макросы обрабатываются препроцессором , поэтому компилятор даже не видит код отключенной функции вообще!

Избегайте макросов, если можете.Они обманывают вас, используя преимущества умного компилятора.Пишите ваш код на C столько, сколько можете, а не в хитрости поиска и замены.

Например, вы можете создать функцию int functionA(int type) и условно реализовать различные детали на type ...

2 голосов
/ 14 ноября 2011

Вы не можете.Только одна из функций будет создана компилятором, в зависимости от значения RAND.

1 голос
/ 14 ноября 2011

Примерно так близко, как вы получите, является одним из следующих:

int functionA()
{
  #if RAND
  /* stuff that happens only when RAND is defined */
  #endif
  /* stuff that happens whether RAND is defined or not */
}

Или, может быть, это:

#if RAND
  #define FUNCA() functionA_priv()
#else
  #define FUNCA() functionA()
#endif

int FUNCA()
{
  /* the non-RAND version of functionA().
   * It's called functionA_priv() when RAND is defined, or
   * functionA() if it isn't */
}

#if RAND
int functionA()
{
  /* The RAND version of functionA().  Only defined if RAND
   * is defined, and calls the other version of functionA()
   * using the name functionA_priv() via the FUNCA() macro */
  FUNCA();
}
#endif

Использование макроса FUNCA() во второйversion позволяет обычной версии functionA() рекурсивно вызывать себя, используя макрос FUNCA() вместо functionA(), если необходимо, поскольку FUNCA() предоставит правильный идентификатор независимо от того, какое имя используется для функции.

1 голос
/ 14 ноября 2011

Я не вижу, как это можно сделать напрямую.Вместо этого создайте отдельную функцию вне #if/#else, скажем, functionB(), и переместите туда весь код из последнего functionA() и замените его вызовом functionB().Затем вы можете позвонить functionB() с первого functionA().

0 голосов
/ 14 ноября 2011

Ты не. Макросы препроцессора оцениваются при компиляции программы. В этом случае будет скомпилирована только одна из функций на основе значения RAND во время компиляции. Возможно, вы хотите использовать здесь оператор if, а не макрос препроцессора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...