C编程:使用宏调用函数
问题描述:
我想从涉及宏的函数调用另一个函数。C编程:使用宏调用函数
这里有一个例子:
#if RAND
int functionA() {
//How to call the bottom function from here?
}
#else
int functionA() {
}
通知他们都是相同的函数名。如何从'if'函数调用'else'函数。
感谢
答
我不知道怎样可以直接完成。相反,请在#if/#else
之外创建一个单独的功能,例如functionB()
,然后将所有代码从最后的functionA()
移到那里,并通过致电functionB()
进行替换。然后,您可以拨打functionB()
从第一个functionA()
。
答
你不能。根据RAND
的值,编译器仅创建其中一个函数。
答
你不知道。编译程序时会评估预处理器宏。在这种情况下,根据编译时RAND
的值仅编译其中一个函数。这似乎也许你想在这里使用if语句,而不是预处理宏。
答
这没有意义,也是不可能的。宏由预处理器处理,所以编译器甚至不会最终看到禁用函数的代码!
如果可以,请避免使用宏。他们欺骗你从一个聪明的编译器中获得好处。用尽可能多的C编写你的代码,而不是搜索和替换的诡计。
例如,你可以做一个功能int functionA(int type)
和type
有条件实现不同的部位......
答
关于尽可能靠近你会得到如下的一个:
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()
将提供正确的标识符,而不管该函数使用哪个名称。
如何使用宏不允许聪明的编译器聪明?我不明白预处理步骤如何影响编译器的行为。 –
当你在预处理器中编写逻辑时,你并没有用C编写它,所以你没有任何语言的工具来检查你正在做什么,并做出潜在的优化。这通常是一个坏主意。编译器是你的朋友,你应该给它尽可能多的信息。 –
但这没有意义。宏的最终结果(在所有的扩展之前,它发生在编译器之前)没有什么特别的关于它的C代码。编译器对你在宏中写的内容以及你没有写的内容一无所知。 –