簡體   English   中英

用C語言編寫如何在運行時使用輸入的函數名稱作為字符串創建函數?

[英]In C language How to Create a function at runtime using the function name being input as a string?

我正在閱讀c中的字符串運算符(#),它會執行令牌粘貼粘貼附加到其上的內容。我想知道是否有可能使用字符串運算符(和)動態創建一個函數(帶有void或non void參數)如果可能,請使用宏-#define)。 我想要以下代碼結構:

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

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

這樣的事情。 基本上,我試圖在運行時創建函數。

進行所需工作的一種駭人聽聞的方式(而且很可能您對該答案不滿意)如下:

  1. 創建要編譯的文本
  2. 將其保存到文件中
  3. 調用編譯器(當然,請確保返回“成功”)
  4. 調用鏈接器並生成DLL(在Windows上)或共享庫(在* nix上)
  5. 動態加載該庫並獲取函數的入口地址
  6. 通過其指針調用函數

C / C ++語言不提供即時執行文本作為代碼的機制(例如,像JavaScript的eval("var i = 0;")

C是一種靜態編譯的語言,因此,它不能使運行時創建函數變得容易,甚至無法實現。 您可以將所需的C代碼寫到.c文件,在系統上執行編譯器,然后動態加載對象庫。 在寫出初始.c文件的過程中,您可以根據需要命名函數。 簡而言之,使用宏無法完成您想做的事情。 使用我剛剛提到的方法是一個巨大的漏洞。 可能,但建議不要這樣做。

如果您只想重命名功能,或者從預先知道的有限功能集中進行選擇並可以編譯到程序中,則可以使用功能指針。 但這使我感到與您嘗試做的事情相反,因為函數指針為您提供了一個靜態名稱(符號),可用於調用變量函數。

如果確實需要重命名函數指針,則可以保留一個函數指針數組,並使用字符串映射對它們進行索引。 然后通過通過字符串(名稱)查找指針來調用函數。 該字符串當然是可變的,因此您可以更改函數的“名稱”。 但這是一條非常繞行的路線,老實說,我看不出這樣做的充分理由。

最后,最有用和正確的解決方案是使用自己的符號表來實現虛擬機。 已經有一些實現了。 想到PythonSlang

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM