语法错误按位操作c

时间:2016-07-22 21:20:07

标签: c++ syntax operators bit-manipulation

我无法弄清楚如何解决这个错误:[错误]预期')'在'<<'之前令牌

此代码位于宏内:

    #define SUM_VARS(a, b, c, d)                               \
    unsigned int *inta = reinterpret_cast<unsigned int *>(&a); \
    unsigned int *intb = reinterpret_cast<unsigned int *>(&b); \
    unsigned int *intc = reinterpret_cast<unsigned int *>(&c); \
    unsigned int *intd = reinterpret_cast<unsigned int *>(&d); \

    (((*inta << 24) & 0xFF000000) | ((*intb << 16) & 0x00FF0000) | ((*intc << 8)  & 0x0000FF00) | (*intd & 0xFF))

我真的不知道错误的位置......提前谢谢!

1 个答案:

答案 0 :(得分:0)

哦,我的 - 这根本不是保存......

想象一下你用SUM_VARS(12, ...)调用它 - 12是一个常量,没有内存地址,因此你的宏在&12失败。

使用SUM_VARS(n + 7, ...)调用它。然后你得到 - 省略演员 - unsigned int* inta = &n + 7;。由于n不是数组,因此未定义的行为!即使不是,你也会得到一个指向与n ...完全无关的值的指针。

使用SUM_VARS(c, ...)调用它,而c类型为charshort - 然后读取内存超过变量c(未定义的行为)。好吧,在一台小端机上,你会在一台大端机器上屏蔽不需要的部分......

为什么要指示这些?

为什么不简单

#define SUM_VARS(a, b, c, d) \
    ((a) << 24 & 0xff000000) \
    |                        \
    ((b) << 16 & 0x00ff0000) \
    |                        \
    ((c) << 16 & 0x0000ff00) \
    |                        \
    ((d) << 16 & 0x000000ff)

注意a,b,c,d周围的括号;它们非常非常重要,以确保在应用bitshift之前完全评估包含具有较低优先级的运算符的表达式。

但是,如果你使用一个函数(Olaf已经推荐过),你会更安全。如果你想节省函数调用的开销(编译器不必遵循这个建议,但是使用这么简单的函数,很可能会这样做),使其内联:

inline unsigned int sumVars(unsigned int a, unsigned int b, unsigned int c, unsigned int d)
{
    return
        (a << 24 & 0xff000000)
        |
        (b << 16 & 0x00ff0000)
        |
        (c << 16 & 0x0000ff00)
        |
        (d << 16 & 0x000000ff);
}

请注意,现在不再需要内括号,在函数调用之前计算表达式。

如果您想继续下去,可以将其扩展为模板功能:

template < typename T >
T sumAll(T t)
{
    return t;
}
template < typename T, typename ... Values >
T sumAll(T t, Values ... values)
{
    return t + sumAll(values...);
}