簡體   English   中英

在運行時定義C ++函數

[英]Define C++ function at runtime

我正在嘗試調整我編寫的一些數學代碼以允許任意函數,但我似乎只能通過在編譯時預先定義它們來實現,這似乎很笨拙。 我目前正在使用函數指針,但據我所知,仿函數會出現同樣的問題。 為了提供一個簡單的例子,對於前向差分,使用的代碼是:

double xsquared(double x) {
    return x*x;
}

double expx(double x) {
    return exp(x);
}

double forward(double x, double h, double (*af)(double)) {
    double answer = (af(x+h)-af(x))/h;

    return answer;  
}

前兩個函數中的任何一個都可以作為第三個參數傳遞。 但是,我想要做的是傳遞用戶輸入(在有效的C ++中),而不是事先設置功能。 任何幫助將不勝感激!

從歷史上看,C ++中沒有提供您要求的功能。 通常的解決方法是為C ++以外的語言嵌入解釋器(例如,Lua和Python專門用於集成到C / C ++應用程序中以允許腳本編寫),或者使用您的應用程序創建特定於您的應用程序的新語言。自己的解析器,編譯器等。然而,這正在改變。

Clang是一個新的開源編譯器,由Apple開發,利用LLVM。 Clang從一開始就設計為不僅可以用作編譯器,還可以用作可以嵌入到應用程序中的C ++庫。 我自己沒有嘗試過,但是你應該能夠用Clang做你想做的事 - 你將它作為一個庫鏈接,並要求它將用戶輸入的代碼編譯到應用程序中。

您可以嘗試查看ClamAV團隊已經如何做到這一點,以便可以用C語言編寫新的病毒定義

至於其他編譯器,我知道GCC最近增加了對插件的支持。 也許可以利用它來橋接GCC和你的應用程序,但由於GCC不是設計用於從一開始就用作庫,因此可能更難。 我不知道任何其他具有相似能力的編譯器。

由於C ++是一種完全編譯的語言,除非您編寫自己的編譯器或解釋器,否則無法將用戶輸入轉換為代碼。 但是在這個例子中,可以為域特定語言構建一個簡單的解釋器,它將是數學公式。 一切都取決於你想做什么。

您始終可以獲取用戶的輸入並通過編譯器運行它,然后執行生成的二進制文件。 這當然會帶來安全風險,因為它們可以執行任意代碼。

可能更容易設計一種簡約語言,讓用戶定義簡單的函數,用C ++解析它們以執行正確的代碼。

最好的解決方案是使用嵌入式語言(如lua或python)來完成此類任務。 請參閱例如選擇嵌入式語言以獲取建議。

雖然看起來像是一個吹噓,但是有很多人為c ++和c編寫了方程解析器和解釋器,許多商業,許多有缺陷,並且與人群中的面孔不同。 一個開始的地方是大學的家伙寫中綴到postfix翻譯。 其中一些系統使用paranthetical分組,然后將項目放在堆棧中,就像在舊的HP STL庫中找到的那樣。 我花了30秒鍾發現了這個:

http://www.speqmath.com/tutorials/expression_parser_cpp/index.html

可能的搜索字符串:“gcc'方程解析器'中綴到后綴'

與其他語言(如Perl)不同,C ++無法對其自身進行運行時解釋。

這里唯一的選擇是允許用戶編譯可在運行時由應用程序動態加載的小型共享庫。

嗯,你可以做兩件事:

  1. 充分利用boost / C ++ 0x lambda並在運行時定義函數。

  2. 如果只需要數學公式,那么像muParser這樣的庫被設計為將字符串轉換為字節碼,這可以看作是在運行時定義一個函數。

您可以使用tiny C編譯器作為庫(libtcc)。

它允許您在運行時編譯任意代碼並加載它,但它只適用於C而不是C ++。

一般來說,唯一的方法是:

  • 將代碼傳遞給編譯器並創建共享對象或DLL
  • 加載此共享對象或DLL
  • 使用此共享對象中的函數。

暫無
暫無

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

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