在 C 语言中对宏使用预处理器语句



我正在制作一个程序,该程序根据第二个参数的值向左或向右移动值。如果它是正的,那么它就会左移,否则它会右移。N 是它向左或向右移动的次数。我在实现宏时遇到问题。

#include <stdio.h>
#define SHIFT(value, n) 
#if (n) > 0
    (unsigned int value) <<= (int n);
#else 
    ( (unsigned int value)) >>= (int -n);

int main()
{
    printf("%dn", SHIFT(1, 4));
} 

目前我收到条件指令错误。

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);
}

你的#define没有做你认为它做的事情。您需要继续使用 .由于 n 在运行时是已知的(假设您的情况只是一个简化),您可以使用常规函数,并在需要时内联它:

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

将这些行与组合在一起。 你也错过了#endif

就地宏:

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

返回移位值:

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

最新更新