2014-10-20 80 views
-1

在c中有一種方法可以將字符串轉換爲命令?例如:如何將字符串轉換爲c中的命令?

void x(string n){ 
    //do something 
} 
void y(int n){ 
    //do something 
} 
void z(int n){ 
    //do something 
} 
stringForConvert="z(10);y(2);x(\"Its cool\");"; 
mysteryCommand(stringForConvert); 

請注意,我沒有奢望寫入其他文件並編譯它。

+4

你的意思是'eval'函數?不,C沒有。你將不得不自己解析這個字符串,並解釋它。 PS:'stringForConvert'賦值是錯誤的:單引號包含單個'char',雙引號包含一個字符串 – 2014-10-20 07:51:38

+0

在什麼操作系統上?爲什麼不能奢侈地在文件中編寫一些C代碼(在運行時),然後編譯並動態加載它? – 2014-10-20 07:53:05

+0

'eval'函數?你如何解析一個字符串並解釋它?對不起,如果這是基本的;我是C新手! – 2014-10-20 07:54:23

回答

5

不,因爲C是一種編譯語言,所以這不是很容易。

C不像典型的動態/腳本語言,它依賴於大型運行時環境。這樣的語言通常有一個函數(在PerlPython中,它被稱爲[eval()])可以做你想做的事情,但是C不能這樣做,因爲編譯器並沒有被「編入」編譯的程序中,它是一個單獨的相當大)的計劃。

C可被編譯成不運行任何樣的外部環境,但即使你包括它的C運行時比編譯器要小得多,一般。

你將不得不從你的程序中調用實際的編譯器,或者自己做所有的事情。

調用編譯器當然要求您確切地知道要使用哪個編譯器,並且它甚至可以從命令行使用。然後你可以使用例如system()調用編譯器,然後添加代碼以檢查輸出是否已正確生成,並使用另一個system()函數調用來運行新生成的程序。在您的程序和新編譯的程序之間共享數據將非常複雜。

這樣做需要熟悉編譯器完成的許多任務,如tokenizing,parsing以及評估分析樹。這些是大型複雜的主題,不容易在這裏通過示例顯示。

+0

你能告訴我一個例子請 – 2014-10-20 08:18:13

+1

@AsimPoptani:這裏沒有人會爲您免費編寫代碼。如果遇到特定的與編碼相關的問題,則可以通過此網站訪問該網站。目標是幫助您瞭解問題,並告訴您如何解決問題。這裏解釋了C中沒有'eval'的原因。也列出了替代方案(解析字符串,編譯字符串以及所有這些)。要求一個準備好複製粘貼的例子是要求人們爲你做你的工作。這不會發生 – 2014-10-20 10:31:29

0

你不能,但從我收集你可能能夠運行機器碼。 See this

+0

你能告訴我一個例子 – 2014-10-20 08:18:36

0

你不能那樣做。

隨着編譯器將您的代碼轉換爲執行的機器代碼。 所以一個String不能被C自己執行。

你只能使用一個庫(如果存在的話),它可以在運行時解析這些命令。

但是如果你想的話,我會建議使用其他語言比C,因爲C是機器代碼優化,而不是解析代碼。

2

你不能在標準C99中做你想要的。

然而,尤其是在Linux和其他POSIX系統,你可能會使用一些嵌入式解釋像LuaGuile等考慮一些技巧,比如

  • ......據我所知,Lua是移植到任何C99系統。
  • 使用一些bytecodevirtual machinenekovmparrot,等...
  • 寫你自己的parser(例如使用recursive descent技術)和評估者或​​爲您的域特定表達語言
  • 在某些例如生成一些C代碼。 gen01.c文件(在運行時),然後將編譯(使用gcc -Wall -fPIC gen01.c -O -g -shared -o gen01.so ....)分叉到共享對象,然後動態加載(使用dlopen(3)"./gen01.so"dlsym在適當的符號名稱上)該共享對象。相信我,我在MELT這樣做,它可以更快地兼容交互式使用(用你的話說,奢侈品在實踐中是可以承受的)!
  • 使用一些JIT compilation庫像libjitLLVMGNU lightning在飛行中

在某些平臺上產生的機器代碼,你可以考慮使用tinycc:它編譯速度非常快一些C代碼(甚至從一個字符串,如果使用它的libtcc)非常緩慢和未優化的機器碼。

+0

我不能使用這個,因爲我不知道操作系統這將運行在 – 2014-10-20 08:05:58

+0

你真的應該知道這一點。因此,您首先了解目標環境(操作系統,處理器),並瞭解可用的操作系統,庫和編譯器。你不能在抽象中編程這樣的東西。 – 2014-10-20 08:07:39

+0

腳本語言(如Lua或Guile或tcl)可以靜態鏈接到您的應用程序。如果你可以爲給定的平臺編譯你的應用程序,你應該沒問題。特別是Lua qhose,唯一的先決條件是用一個標準的C編譯器編譯(我相信ansi已經足夠了)。允許執行任意代碼是一個非常糟糕的主意。 – 2014-10-20 11:58:43

相關問題