2011-11-14 69 views
0

我想从涉及宏的函数调用另一个函数。C编程:使用宏调用函数

这里有一个例子:

#if RAND 
int functionA() { 

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


#else 
int functionA() { 


} 

通知他们都是相同的函数名。如何从'if'函数调用'else'函数。

感谢

回答

1

我不知道怎样可以直接完成。相反,请在#if/#else之外创建一个单独的功能,例如functionB(),然后将所有代码从最后的functionA()移到那里,并通过致电functionB()进行替换。然后,您可以拨打functionB()从第一个functionA()

2

你不能。根据RAND的值,编译器仅创建其中一个函数。

0

你不知道。编译程序时会评估预处理器宏。在这种情况下,根据编译时RAND的值仅编译其中一个函数。这似乎也许你想在这里使用if语句,而不是预处理宏。

3

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

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

例如,你可以做一个功能int functionA(int type)type有条件实现不同的部位......

+0

如何使用宏不允许聪明的编译器聪明?我不明白预处理步骤如何影响编译器的行为。 –

+0

当你在预处理器中编写逻辑时,你并没有用C编写它,所以你没有任何语言的工具来检查你正在做什么,并做出潜在的优化。这通常是一个坏主意。编译器是你的朋友,你应该给它尽可能多的信息。 –

+2

但这没有意义。宏的最终结果(在所有的扩展之前,它发生在编译器之前)没有什么特别的关于它的C代码。编译器对你在宏中写的内容以及你没有写的内容一无所知。 –

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()将提供正确的标识符,而不管该函数使用哪个名称。