我想从涉及宏的函数中调用另一个函数。
以下是一个示例:
#if RAND
int functionA() {
//How to call the bottom function from here?
}
#else
int functionA() {
}
请注意,它们都是相同的函数名称。如何从'if'函数调用'else'函数。
由于
答案 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语句,而不是预处理器宏。