是有可能寫從該呼叫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
是有可能寫從該呼叫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
號宏將被啓動#define WATCH(X) ...
,在預處理器中無法解析X
。
這並不容易(也許你不可能問你的方式)。也許你想要一些aspect-oriented programming
考慮使用一些其他的預處理器(例如GPP或m4
)和/或通過一些專門的程序或腳本,你會寫生成你的C++代碼。
您也可以使用MELT自定義您的GCC編譯器(至少在Linux上,最近使用gcc
或g++
)。這需要了解GCC內部(特別是Gimple表示),並在MELT中寫入一個額外的優化通行證來完成轉換(可能需要幾周的工作)。
這是不可能的預處理獨自一人,但它可能與一些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通過表達式模板,與宏的結合使得它易於使用。
OP使用C(C99) - 不確定爲什麼問題被標記爲C++。 – 2014-10-02 08:55:00
@PaulR right,corrected,thx – memic 2014-10-02 08:58:32
宏調用中的操作符不可行(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);
帶有未受保護的複合語句。
考慮使用其他預處理器(例如[GPP](http://en.nothingisreal.com/wiki/GPP)或'm4')和/或通過專門的程序生成C++代碼。 – 2014-10-02 08:39:06
避免爲複雜的東西使用預處理器。這是很難調試,也沒有類型檢查豪華 – 2014-10-02 08:40:09
我懷疑這是一個XY問題。在C++中,我們可能會通過將所有4個變量聲明爲自定義類型來解決X問題,以便可以重載它的運算符以打印參數。 – MSalters 2014-10-02 08:41:33