2011-05-19 127 views
1

我想知道C++中是否存在「評估」函數,如Matlab函數。C++中的「評估函數」

實際上,我需要一個可以像命令行一樣解釋字符串的函數。

感謝您的答案。

+2

嗨,騎士85!歡迎來到Stack Overflow。如果你可以包含一個鏈接到Matlab的'evaluate'函數的文檔,那將會很有幫助。既然我不知道它做了什麼,我不能告訴你C++的功能是什麼樣的。 – 2011-05-19 17:00:47

+0

['eval(expression)'](http://www.mathworks.com/help/techdoc/ref/eval。html)「執行*表達*,一個包含任何有效的MATLAB表達式的字符串。」你想要一個可以執行任意MATLAB表達式的C++函數嗎?還是你想要一個可以執行任意C++表達式的C++函數?或者是其他東西? – 2011-05-19 17:05:32

+0

這聽起來像是一個「XY問題」http://mywiki.wooledge.org/XyProblem。 @ Cavs85,請描述你的最終目標,而不僅僅是你被困在什麼地方。 – 2011-05-19 17:58:41

回答

4

您可以使用system()http://linux.die.net/man/3/system

+3

這樣可以讓你調用一些提供'eval'風格函數的程序,讓我們不要將它與標準C++表達式求值器混淆。 – 2011-05-19 17:04:48

+0

windows上還有'system()'嗎? Q提到'visual studio'。 – 2011-05-19 17:09:06

+0

@Ben,由於OP要求「可以像命令行一樣解釋字符串的函數」,我使用了'system()'。你是正確的,它不等效於Matlab的'eval' – 2011-05-19 17:09:56

6

如果你實際上是試圖「評估」正在運行的C++應用程序中的C++源代碼,則基本沒有 - 它不是由語言指定的功能。

對於C++子集(例如CInt,Ch和UnderC),有解釋器 - 如果它們是相對簡單的,它們可以運行C++程序。或者,可以將一些嵌入到已編譯的C++程序中,以允許一些運行時源代碼評估,但是訪問權限有限,並且無法更改預編譯的代碼及其變量。

也有可能對正在運行的程序調用編譯器和動態加載/鏈接得到的庫,但是這是一個非常不尋常的做法,不是沒有性能,安全性和互操作性問題:

  • 創建編譯器,編譯和鏈接的新過程是一個相對資源匱乏且運行緩慢的操作,但是一旦庫連接起來,新代碼就可以以正常的脫機函數調用速度執行,外部過程
    • 確保路徑和編譯器可執行文件的名稱不能被惡意輸入被改變成沒有惡意軟件代替或感染編譯器
    • 上即時源代碼不包含像system()語句程序
    • exec()unlink()呼叫,濫用網絡連通性,咀嚼無端CPU /存儲器/描述符等
  • 預編譯的C++程序不能被修改或容易/深受新鏈接的碼探測,所以主新行爲的機制必須已經設計到預編譯的應用程序中:期望f或新近可訪問的變量,函數和工廠方法/虛擬調度。

如果你確實需要更多的東西有限,像能力評估數學表達式或邏輯謂詞,可能在C++表示 - 源的風格,或許讀取或設置你的一些價值觀,那麼各種更加有限,專業圖書館和嵌入解釋可用。甚至有創建這種解析器的庫,例如boost spirit庫。最後,其他語言(Lua,Ruby,Python,Perl,TCL等)的解釋器可能嵌入C++應用程序中,體現各種互操作性和安全性的方法。

+0

+1:很好的答案。 – 2011-05-19 17:58:51