2

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

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

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

像这样的东西。基本上我试图在运行时创建函数。

4

2 回答 2

4

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

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

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

于 2012-07-12T15:05:39.650 回答
0

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

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

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

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

于 2012-07-12T15:12:55.837 回答