2014-01-06 79 views
1

我正在製作一個程序,根據第二個參數的值將值左移或右移。如果是肯定的,則它向左移動,否則向右移動。 N是向左或向右移動的次數。我在執行我的宏時遇到了麻煩。在C中使用宏的預處理器語句

#include <stdio.h> 

#define SHIFT(value, n) 

#if (n) > 0 
    (unsigned int value) <<= (int n); 
#else 
    ((unsigned int value)) >>= (int -n); 



int main() 
{ 
    printf("%d\n", SHIFT(1, 4)); 
} 

目前我得到一個條件指令錯誤。

+0

嘗試'#定義SHIFT(值,n)\'。最後一個反斜槓表示下一行是當前行的一部分。 –

回答

6

C預處理器實際上並不按照您打算使用它的方式工作。特別是,您不能在宏的擴展中使用其他CPP指令(如#if,...)。此外,由於宏擴展是一個靜態編譯時的功能,這將不利於無論如何,當實際移值在運行時只知道:

int value_to_shift = read_some_integer_from_user(); 
int amount_to_shift_by = read_another_integer_from_user(); 
int shifted_value = SHIFT(value_to_shift, amount_to_shift_by); 

如果你不介意的潛在雙的宏參數評價 - ,去與三元運算符:

#define SHIFT(value, n) ((n) < 0? ((value) >> (-n)) : ((value) << (n))) 

注意,在使用<<=(和>>=)爲您的代碼做的是最有可能不是你想要的,因爲,你通過文字數字作爲value參數給你的SHIFT宏。

我可能會去一個很小的輔助函數在這裏,而不是一個宏:

static int 
shift(int value, int nbits) 
{ 
    return nbits < 0? (value >> -nbits) : (value << nbits); 
} 
+0

好的。有沒有辦法在參數中使用數據類型? –

+0

@XiJiaopin:你爲什麼要這樣? –

+0

在這個特定的程序中,使用無符號整數進行移位是合適的。 –

1

#define沒有做什麼,你認爲它。您需要繼續\。而且由於N是在運行時已知的(假設你的情況只是一個簡化),你可以使用常規的功能,如果需要它內聯:

inline int shift(int value, int n) { 
    if (n < 0) { 
     return (unsigned int) value << n; 
    } 
    else { 
     return (unsigned int) value << -n; 
    } 
} 
+0

您的演員陣容看起來很奇怪。你是不是指'(unsigned int)value'? – Dirk

+0

@Dirk Woops,修好了,謝謝 –

0

您需要的線用\結合起來。你也錯過了thed #endif

就地宏:

#define SHIFT(value, n)  \ 
    value = ((n) > 0) ?  \ 
      value << (n) : \ 
      value >> -(n) 

返回移位的值:

#define SHIFT(value, n)  \ 
    (((n) > 0) ?   \ 
      (value) << (n) : \ 
      (value) >> -(n)) 
+0

我知道這就是爲什麼我寫它不起作用。那麼最好刪除它。 – egur