【问题标题】:In C language How to Create a function at runtime using the function name being input as a string?在 C 语言中如何使用作为字符串输入的函数名在运行时创建函数?
【发布时间】:2012-07-12 08:51:53
【问题描述】:

我正在阅读 c 中的 stringizing 运算符 (#),它会粘贴任何附加到它的标记。我想知道是否可以创建一个函数(带有 void 或非void arguments) 动态地使用 stringizing 运算符(如果可能,还使用宏 - #define)。 我想要以下代码结构:

#define #function_name(/*void or non void */)  void function_name(/*void or non void */)

char *function_name;
scanf("%s",function_name);

类似的东西。基本上我试图在运行时创建函数。

【问题讨论】:

  • 宏不是运行时的。
  • 宏(包括 stringize 运算符)在编译时完成,而不是在运行时完成。
  • 你写这个问题是不是很着急?!
  • 并添加到上面的合唱中,您不能在标准 c 中在运行时创建函数。

标签: c function-pointers stringify


【解决方案1】:

做你需要的事情的一种hacky方式(你很可能不会对这个答案感到满意)如下:

  1. 创建要编译的文本
  2. 将其保存到文件中
  3. 调用编译器(当然要确保它返回“成功”)
  4. 调用链接器并生成 DLL(在 Windows 上)或共享库(在 *nix 上)
  5. 动态加载该库并获取函数的入口地址
  6. 通过指针调用函数

C/C++ 语言不提供将文本作为代码即时执行的机制(例如 JavaScript 的 eval("var i = 0;")

【讨论】:

    【解决方案2】:

    C 是一种静态编译的语言,因此它不会使在运行时创建函数变得容易,甚至通常是不可能的。您可以将所需的 C 代码写入 .c 文件,在系统上执行编译器,然后动态加载对象库。在写出初始 .c 文件的过程中,您可以将函数命名为您想要的任何名称。简而言之,使用宏不能做你想做的事。使用我刚才提到的方法是一个巨大的黑客攻击。可能,但不明智。

    如果你只是想重命名一个函数,或者从你预先知道的有限的一组函数中选择并且可以编译到程序中,那么你可以使用函数指针。但这让我觉得与您尝试做的相反,因为函数指针为您提供了一个静态名称(符号),可用于调用变量函数。

    如果你真的需要重命名函数指针,你可以保留一个函数指针数组,并使用字符串映射对它们进行索引。然后通过它们的字符串(名称)查找它们的指针来调用你的函数。该字符串当然是可变的,因此您可以更改函数的“名称”。但这是一条非常迂回的路线,老实说,我找不到这样做的充分理由。

    最后,最有用和最正确的解决方案是使用自己的符号表实现虚拟机。已经有实现了; PythonSlang 浮现在脑海中。

    【讨论】:

    • 许多编译语言都有一流的功能。与编译无关。
    • 原谅我,“静态编译”会是一个更好的术语。但是,拥有一流的函数并不意味着可以即时编写函数。 'eval' 和 'exec' (或任何你的语言调用这些操作)不属于具有一流功能的语言。它们是动态语言属性的一部分。在这种情况下,C 是一种在运行时具有静态符号表的编译语言(实际上在运行时,它只是内存地址)这一事实是这里的障碍。
    • 哦,我明白你的意思了。我不清楚是否需要 eval,但我想这很可能。
    • 我有点同意 sirlark 的观点。如何创建一个函数名称(动态使用 ## 运算符仅创建一个函数名称),它可以充当函数指针,可以使用函数指针机制。任何想法!
    猜你喜欢
    • 2014-02-11
    • 1970-01-01
    • 2020-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-20
    • 2012-10-05
    • 2021-03-29
    相关资源
    最近更新 更多