C编程:用宏调用函数

时间:2011-11-14 18:30:09

标签: c macros

我想从涉及宏的函数中调用另一个函数。

以下是一个示例:

#if RAND
int functionA() {

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


#else
int functionA() {


}

请注意,它们都是相同的函数名称。如何从'if'函数调用'else'函数。

由于

5 个答案:

答案 0 :(得分:3)

这没有任何意义,也是不可能的。宏由预处理器处理,因此编译器甚至不会最终看到禁用函数的代码!

如果可以,请避免使用宏。他们欺骗你不会得到一个聪明的编译器的好处。尽可能多地用C编写代码,而不是搜索和替换技巧。

例如,您可以创建一个函数int functionA(int type)并在type上有条件地实现不同的部分......

答案 1 :(得分:2)

你做不到。编译器只会创建其中一个函数,具体取决于RAND的值。

答案 2 :(得分:1)

我看不出如何直接做到这一点。相反,在#if/#else之外创建一个单独的函数,比如functionB(),然后移动上一个functionA()的所有代码,并通过调用functionB()替换它。然后,您可以从第一个functionB()致电functionA()

答案 3 :(得分:1)

尽可能接近以下之一:

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()宏允许functionA()的正常版本在必要时使用FUNCA()宏而不是functionA()递归调用自身,因为FUNCA()将提供正确的标识符,无论该函数使用哪个名称。

答案 4 :(得分:0)

你没有。编译程序时会评估预处理程序宏。在这种情况下,根据编译时RAND的值,只编译其中一个函数。看起来好像你想在这里使用if语句,而不是预处理器宏。