我正在使用BOOST_PP在預處理器中執行預編譯計算。我專注於代碼大小爲非常重要的應用程序。 (所以請不要說編譯器應該或通常這樣做,我需要控制什麼在編譯時執行和什麼代碼生成)。但是,我希望能夠爲整數常量和變量使用相同的宏/函數名稱。作爲簡單的例子,我可以有在Boost預處理器中混合變量和整型常量
#define TWICE(n) BOOST_PP_MUL(n,2)
//.....
// somewhere else in code
int a = TWICE(5);
這做什麼,我也想,在編譯時評價到
int a = 10;
。
不過,我也希望它在
int b = 5;
int a = TWICE(b);
使用這應該是預處理,
int b = 5;
int a = 5 * 2;
當然,我可以使用傳統的宏像
#define TWICE(n) n * 2
這樣做
但它然後不做我想要它做的整型常量(在編譯時評估它們)。
所以,我的問題是,是否有一個技巧來檢查參數是文字還是變量,然後使用不同的定義。即是這樣的:
#define TWICE(n) BOOST_PP_IF(_IS_CONSTANT(n), \
BOOST_PP_MUL(n,2), \
n * 2)
編輯: 那麼我真的是經過一些方法來檢查,如果事情是一個常數可以在編譯的時候,因此一個很好的理由爲BOOST_PP_功能。我意識到這與大多數人對預處理器和一般編程建議的期望不同。但是沒有錯誤編程方式,所以如果你不同意它的理念,請不要討厭這個問題。 BOOST_PP庫存在的原因是存在的,這個問題本質上是一致的。它可能只是不可能的。
你可以通過使用模板而不是預處理器來獲得這個 – Anycorn 2010-10-07 18:08:49
@aaa可以模板選擇常量嗎?如果可以的話,我很樂意(即使模板需要C++編譯)。但我堅持如何編寫這樣的模板。 – highBandWidth 2010-10-07 18:13:21
作爲替代方案,您是否已將http://www.boost.org/doc/libs/1_44_0/libs/wave/index.html – Anycorn 2010-10-07 18:39:22