2014-10-02 104 views
-4

是有可能寫從該呼叫C預處理器宏可以生成函數嗎?

WATCH(l1=g1+g2*g3) 

此代碼生成一個宏?

TRACE(g1); 
TRACE(g2); 
TRACE(g3); 
l1=g1+g2*g3; 
TRACE(l1); 

即時通訊不知道這是否有可能,如果是的話,請指出我的方向是正確的。

使用的軟件:ARM-Linux的GNU-GCC,版本4.9.1,目標是Cortex-M3的董事會,語言是C99

問候, memic

+0

考慮使用其他預處理器(例如[GPP](http://en.nothingisreal.com/wiki/GPP)或'm4')和/或通過專門的程序生成C++代碼。 – 2014-10-02 08:39:06

+1

避免爲複雜的東西使用預處理器。這是很難調試,也沒有類型檢查豪華 – 2014-10-02 08:40:09

+2

我懷疑這是一個XY問題。在C++中,我們可能會通過將所有4個變量聲明爲自定義類型來解決X問題,以便可以重載它的運算符以打印參數。 – MSalters 2014-10-02 08:41:33

回答

0

號宏將被啓動#define WATCH(X) ...,在預處理器中無法解析X

0

這並不容易(也許你不可能問你的方式)。也許你想要一些aspect-oriented programming

考慮使用一些其他的預處理器(例如GPPm4)和/或通過一些專門的程序或腳本,你會寫生成你的C++代碼。

您也可以使用MELT自定義您的GCC編譯器(至少在Linux上,最近使用gccg++)。這需要了解GCC內部(特別是Gimple表示),並在MELT中寫入一個額外的優化通行證來完成轉換(可能需要幾周的工作)。

+0

還沒有聽說過關於面向方面的編程c – memic 2014-10-02 08:47:25

+0

@memic原始標籤是C++。 – 2014-10-02 09:13:42

+0

對不起, – memic 2014-10-02 09:19:17

0

這是不可能的預處理獨自一人,但它可能與一些TMP技巧像表達模板,例如,你可以去看看Catch庫:

TEST_CASE("Factorials are computed", "[factorial]") { 
    REQUIRE(Factorial(0) == 1); 
    REQUIRE(Factorial(1) == 1); 
    REQUIRE(Factorial(2) == 2); 
    REQUIRE(Factorial(3) == 6); 
    REQUIRE(Factorial(10) == 3628800); 
} 

這可能會產生信息象下面這樣:

Example.cpp:9: FAILED: 
    REQUIRE(Factorial(0) == 1) 
with expansion: 
    0 == 1 

注意,最後一行0 == 1,怎麼能告訴用戶LHS是0,RHS是1,並且運營商是==?,嗯,這是做ne通過表達式模板,與宏的結合使得它易於使用。

+0

OP使用C(C99) - 不確定爲什麼問題被標記爲C++。 – 2014-10-02 08:55:00

+0

@PaulR right,corrected,thx – memic 2014-10-02 08:58:32

0

宏調用中的操作符不可行(afaics)。但是你可以用一個像簽名這樣的函數來定義一個宏:

#define WATCH(l1,g1,g2,g3) \ 
TRACE(g1); \ 
TRACE(g2); \ 
TRACE(g3); \ 
l1=g1+g2*g3; \ 
TRACE(l1) 

會有幫助嗎?和往常一樣與複合語句,我建議來包裝他們在一個do ... while循環,像

#define WATCH(l1,g1,g2,g3) \ 
do { \ 
    TRACE(g1); \ 
    TRACE(g2); \ 
    TRACE(g3); \ 
    l1=g1+g2*g3; \ 
    TRACE(l1); \ 
} while(0) 

因此,它的行爲就像一個單一的命令;想象

if(condition) WATCH(l1,g1,g2,g3); 

帶有未受保護的複合語句。

+0

是啊,這是類似的user2501建議.. thx :)這裏的問題是,運算符(+,*)在宏裏面.. – memic 2014-10-02 09:08:11

+0

您的意思是調用形式WATCH l1 = g1 + g2 * g3)'已經在代碼中,您不能手動更改它們?然後,您需要比cpp(patch,sed)更好的文本處理作爲構建的一部分。 – 2014-10-02 09:12:33

+0

是l1 + g2 + g * g3是我想要執行的代碼,並且還跟蹤右邊的變量和執行後的左邊的變量 – memic 2014-10-02 09:20:56