2016-05-16 35 views
-2

我需要實現這樣的事情,但使用CMacro:CMacro和整數運算

int a = //some constant; 
int x = //constant 
int c = //constant 
int y = a*x+b; 

我已經試過這樣的:如果我用標誌-E海合會

#define A 3 
#define X 6 
#define B 8 
#define Y ((A)*(X) + (B)) 

然而,給我看3*6 + 8

是否有任何方法使用CMacro執行整數運算,在替換之前我的意思是?

我的目的是一樣的東西,只是一段代碼...:

#define func_impl(NY,NX,R) \ 
void func_#NY_#NX(int* y, int* x) { \ //x size NX, y size NY 
    int tmp[2*NX - R]; \ 
    for(int i = 0; i < 2*NX - R; i++) tmp[i] = 0; \ 
    //other processing operations... \ 
} 

我知道這兩個NX,NY和R先驗的,儘管他們被其他程序產生的。所以基本上我想避免讓程序P1在可能的情況下生成太多的宏常量。

+0

是否有一個原因,你爲什麼首先需要宏?爲什麼不能寫一個泛型函數,或者使用一個函數指針數組?生成函數的函數式宏幾乎肯定是任何已知編程問題的錯誤解決方案。 – Lundin

+0

另外,這個'#define Y A * X + B'是一個常見的初學者錯誤,這反過來表明你現在應該完全遠離宏。 – Lundin

+0

^^是的,直到你有更多的經驗。當你有經驗時,你會知道自己遠離宏。 –

回答

1

不,宏只作爲文本替換,沒有別的。

預處理器評估表達式的唯一地方是它自己的#if/#else結構。但在那裏它可能實際上有點不同於你第一眼看到的,因爲整數類型總是[u]intmax_t

2

但是,如果我用標誌-E海合會它表明我3 * 6 + 8

這實際上是很好,因爲任何像樣的編譯器會這樣表達perfom constant folding,所以你」將在機器代碼中以26結束。

除此之外,您可以嘗試使用static inline函數,該函數具有類型安全的優點。宏很容易出錯並且很難調試。