c

您所在的位置:网站首页 函数调用另一个函数 c

c

2024-05-16 20:58| 来源: 网络整理| 查看: 265

如何#define一个函数来替换另一个函数?

例如,如果我有一个函数 Stuff(intnumbers) 并且想将其替换为 Stuff2(intnumbers, int otherNumbers)。

因此,当调用 Stuff() 时,将使用 Stuff2()。

最佳答案

使用#define 是基本的全局文本替换。

#define Stuff(number) Stuff2(number,0)

这里的零是为了说明;将其替换为任何适当的默认值。如果有必要,您甚至可以调用函数或使用更多宏魔法来计算它。

更新

因此,根据评论,OP 正在尝试重定向 main()。

这是一种具有高度特定用例的技术。首先要记住的是 main() 不是一个普通函数。没错,main() 是特殊。

因此,您不能仅仅替换 main() 并期望事情顺利进行。必须有一个 main(),并且必须根据编译器可接受的变体之一进行声明。 (IMO,您应该更喜欢使用 C 标准所需的两种变体之一。)

拦截用户的main()

该技术通常被那些想要对您的应用程序进行应用级控制,但又希望您认为一切正常的库使用。

他们通过在库的代码中声明main()来实现这一点,并在 header 中将main定义为其他内容,以便当你编写“main()”时它实际上是一个不同的函数。例如:

// quuxlib.c int main( int argc, char** argv ) { int exit_code = 0; // library does initializations here ... // call the user's main(), LOL exit_code = UsersMain( argc, argv ); // perform cleanup ... return exit_code; }

库的标题:

// quuxlib.h #define main UsersMain ...

现在用户的代码看起来正常:

#include "quuxlib.h" int main( int argc, char** argv ) // This is actually UsersMain()! { // Use quuxlib without any further thought }

注意事项和最佳实践

恕我直言,这种技术是糟糕的设计。它试图掩盖实际发生的事情。更好的库设计应该是明确的,并且:

要求您在 main() 中正确初始化和完成库 希望您使用明确的进入程序

前者是首选,因为它能更好地与各种东西相处。例如,Tcl 正确地 Hook 。在这里,您只需创建一个解释器,使用它,然后正常终止。

#include "tcl.h" int main() { Tcl_Interp* interp = Tcl_CreateInterp(); int status = Tcl_Eval( interp, "puts {Hello world!}" ); return 0; }

Tcl 还更进一步,提供 Tcl_Main和 Tcl_AppInit让生活变得非常轻松。 See an example here .

使用显式输入过程与 main() 替换技巧完全相同,只是不需要假装任何东西:

#include "quuxlib.h" int AppMain() // required by QuuxLib { // my main program here ... return 0; }

问题

最后,重新定义 main 的问题是:

它掩盖了真正发生的事情 它使用全局宏替换

好的设计不会试图向您隐瞒事情。全局宏替换也很糟糕。在这种情况下,“main”不是保留字。您可以有一个名为“main”的有效本地标识符。使用全局宏替换可以消除这种可能性。

最后,让一个库提供显式的初始化和终止过程而不是接管主增加用户可用的灵 active 。采用 main() 的库不能与另一个执行相同操作的库一起使用,也不能真正信任它来处理可能出错的事情(恕我直言)以及为库用户提供正确和显式 Hook 的库来处理这类事情。

对于常见情况与多功能性来说,这种权衡是相当不错的。

嗯,我想我现在已经很喜欢胡言乱语了,所以是时候停止了......

关于c - 如何 #define 一个函数来替换另一个函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48976522/



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3