2012-01-12 26 views
1

我有幾個C文件。並且我創建了一個名爲的函數腳本或命令自動更改我的C代碼中的一些東西?

X_STRING(arg1,arg2,arg3,arg4); 

我從不同的C文件中多次調用了該函數。我想將所有這些函數的調用替換爲X_STRING(arg1,arg2,(arg1)* 2,(arg2)* 3);

AWK似乎是解決辦法,但我不知道如何對待所有的情況,因爲我要考慮其中的情況:

  1. 我打電話跟插在目前存在的論據之間的代碼行的新功能

eg

X_STRING(
arg1, arg2, 
arg3, 
arg4); 
  1. 一個參數包含一個括號:

例如

X_STRING(arg1, arg2, (arg3 - 4)*3, arg4); 

有人可以點我好工具來解決我的問題呢?

+0

您是否只有上述兩種情況,還是可以有更多? – 2012-01-12 19:28:01

回答

1

如果您不介意更改輸出格式,您可能會對m4解決方案感到滿意。把下面的文件:

 
define(X_STRING, ``X_STRING''($1, $2, ($1) * 2, ($2) * 3)) 

然後運行:

 
$ m4 def_file file.c 

其中file.c是你的代碼,並def_file與上述內容的文件的名稱。 (這個名字是不相關的。)

如果你的代碼格式良好,這應該有效。 (如果你有不匹配的圓括號,它會失敗。) 這將改變空格,但除此之外應該做你想做的事。

+0

這正是我所需要的,謝謝你.. – vadmeste 2012-01-12 19:35:10

+0

但我有一個問題,你認爲awk是否也能做到這一點? – vadmeste 2012-01-12 20:12:10

+0

我看不到一個簡單的awk解決方案。試圖匹配大括號會很困難。考慮如下輸入:X_STRING(foo(a,b),1,2,3); – 2012-01-12 21:04:18

0

另一種解決方案可能是定製GCC編譯器爲此,通寫在C或GCC擴展GCC插件寫在MELT

編譯器內工作的好處是,你處理一些編譯器的內部表示(如GCC的Gimple),而不僅僅是文本。如果例如對X_STRING的調用出現在宏的擴展或內聯函數中,則文本方法將無法很好地工作。

擴展GCC編譯器也有一些缺點:它是GCC特有的(甚至可能取決於GCC的版本),並且需要幾天的工作。

相關問題