Roh*_*gga 1 c debugging macros function
我正在制作一个程序,根据第二个参数的值向左或向右移动值.如果是正数则向左移动,否则向右移动.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("%d\n", SHIFT(1, 4));
}
Run Code Online (Sandbox Code Playgroud)
目前我收到条件指令错误.
C预处理器并没有真正按照您打算使用它的方式工作.特别是,您不能#if在宏的扩展中使用其他CPP指令(如,...).此外,由于宏扩展是静态编译时功能,当实际的移位值仅在运行时知道时,这无论如何都无济于事:
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);
Run Code Online (Sandbox Code Playgroud)
如果您不介意对宏参数进行潜在的双重评估,请使用三元运算符:
#define SHIFT(value, n) ( (n) < 0? ((value) >> (-n)) : ((value) << (n)) )
Run Code Online (Sandbox Code Playgroud)
请注意,在代码中使用<<=(和>>=)很可能不是您想要的,因为您将文字数作为value参数传递给SHIFT宏.
我可能会在这里找一个小辅助函数而不是宏:
static int
shift(int value, int nbits)
{
return nbits < 0? (value >> -nbits) : (value << nbits);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
108 次 |
| 最近记录: |