2013-04-05 84 views
8

在C++中可以通過字符串變量執行C++代碼。 就像在Javascript:從字符串變量執行C++

var theInstructions = "alert('Hello World'); var x = 100"; 

var F=new Function (theInstructions); 

return(F()); 

我想非常類似如Javascript在C++的東西。怎麼做 ?

+0

沒有。不是。您必須將整個C++編譯器複合體嵌入到您的應用程序中,以便進行遠程操作。 – 2013-04-05 19:02:27

+3

如果您想要嵌入式腳本語言,請考慮Lua。 – 2013-04-05 19:04:39

+0

@jrok:當然是。實際上,我過去做過這樣的事情(對於我來說,一種用於較老光線追蹤器的軟件着色器實現)。唯一的「魔術」是調用編譯器。 – 2013-04-05 19:24:19

回答

7

您將需要調用編譯器來編譯代碼。另外,您需要生成一些代碼來將該字符串包裝在函數聲明中。最後,你會以某種方式加載編譯後的代碼。

如果我這樣做(我將)我將:

  1. 串聯圍繞代碼的標準包裝函數頭
  2. 調用通過命令行(system())建立一個編譯器共享 庫(.dll上windows或.so在Linux上)
  3. 加載共享庫和映射函數
  4. Invok e功能

在大多數情況下,這實際上不是您想要編寫C代碼的方式。

+0

這聽起來像是一個計劃,我很感興趣。你可以帶一個簡單的Windows例子嗎? – Jigberto 2013-04-05 19:17:10

+3

@Jigberto:你顯然沒有在這裏找到答案的基本含義。這並不簡單,因爲這不是C++的意義所在。如果你問一個簡單的例子,你不應該對這個「計劃」「感興趣」。 – DevSolar 2013-04-05 19:20:12

+0

@DevSola好了,答案符合我的需求:)所以我很樂意讓它變得更真實。我知道C++並不是這樣設計的,但我們對事物沒有限制,而且我們總能找到解決方法。我喜歡這個答案,以及由Luchian Grigore發佈的答案。 – Jigberto 2013-04-05 19:26:22

5

直接,沒有。但您可以:

  • 將該字符串寫入文件。
  • 調用編譯器並編譯該文件。
  • 執行生成的二進制文件。
3

C++是編譯的語言。您將C++源代碼編譯爲機器代碼,即可執行文件。這是加載和執行。編譯器知道C++(並且具有所有可用的庫頭文件)。可執行文件沒有,這就是爲什麼它不能將字符串轉換爲可執行代碼。你可以,事實上,執行字符串的內容,如果它恰好包含機器代碼指令,但是這通常是一個非常糟糕的主意......

這並不意味着它不會是可能做這種運行時編譯。在C++中很少(如果確實是任何東西)是不可能的。但是你要做的是實現一個C++編譯器對象......在決定你真的需要這個之前,先看看其他編譯器項目。

解釋語言可以輕鬆地做到這一點 - 他們只需要將字符串傳遞給已經運行程序的解釋器。他們在其他方面支付了這種靈活性。

0

簡短的回答是沒有。黑客將有一個現場日。但是,您可以使用Windows IActiveScriptSite接口來利用Java/VB腳本。 Google IActiveScriptSite,網上有很多例子。或者你可以做我目前正在做的事情,推出你自己的腳本引擎。

8

不,C++是一種靜態類型,編譯爲本地二進制語言。

雖然您可以使用LLVM JIT編譯,但不會中斷運行時編譯和鏈接。應該可行,但它不在C++領域。

如果你想在C++下使用腳本引擎,你可以使用例如JS--它是迄今爲止最快的動態解決方案。 Lua,Python,Ruby也可以,但是通常會比較慢,考慮到你只是將它用於腳本編寫,這可能並不是一件可怕的事情。

例如,在Qt的你可以這樣做:

int main(int argc, char *argv[]) 
{ 
    QCoreApplication a(argc, argv); 

    QScriptEngine engine; 
    QScriptValue value = engine.evaluate("var a = 20; var b = 30; a + b"); 

    cout << value.toNumber(); 

    return a.exec(); 
} 

,你會得到50;)

+0

您忘記了LuaJIT,如果不是已經存在的話,LuaJIT將會成爲最快的 – 2013-04-05 19:15:23

+0

@ W.B。是的,LuaJIT看起來相當快。希望有與其他語言的頭對頭比較,但他們網站上的基準只與Lua相比。 – dtech 2013-04-05 19:21:34