C++ 按位操作c的语法错误

C++ 按位操作c的语法错误,c++,syntax,operators,bit-manipulation,C++,Syntax,Operators,Bit Manipulation,我不知道如何解决这个错误:“哦,天哪,这根本不是保存…” 假设您使用SUM\u VARS(12,…)-12是一个常量,没有内存地址,因此宏在&12处失败 用SUM\u VARS(n+7,…)调用它。然后,您将获得–忽略强制转换–无符号int*inta=&n+7。因为n不是数组,所以行为未定义!即使不是,您也会得到一个指向与n完全无关的值的指针 用SUM_VARS(c,…)调用它,而c的类型是char或short——然后通过变量c读取内存(未定义的行为)。好的,在一个小的endian机器上,你会把

我不知道如何解决这个错误:“哦,天哪,这根本不是保存…”

假设您使用
SUM\u VARS(12,…)
-12是一个常量,没有内存地址,因此宏在
&12
处失败

SUM\u VARS(n+7,…)
调用它。然后,您将获得–忽略强制转换–
无符号int*inta=&n+7。因为n不是数组,所以行为未定义!即使不是,您也会得到一个指向与n完全无关的值的指针

SUM_VARS(c,…)
调用它,而c的类型是
char
short
——然后通过变量c读取内存(未定义的行为)。好的,在一个小的endian机器上,你会把不需要的部分隐藏起来,在一个大的endian机器上

为什么要用这些指针

为什么不简单

#define SUM_VARS(a, b, c, d) \
    ((a) << 24 & 0xff000000) \
    |                        \
    ((b) << 16 & 0x00ff0000) \
    |                        \
    ((c) << 16 & 0x0000ff00) \
    |                        \
    ((d) << 16 & 0x000000ff)
定义和变量(a、b、c、d)\
(a)用手解析宏,你会看到。为什么不使用函数?添加C++标签-预处理器宏,模板(尤其是RealTytCasCube)-应该在你的意义上…
#define SUM_VARS(a, b, c, d) \
    ((a) << 24 & 0xff000000) \
    |                        \
    ((b) << 16 & 0x00ff0000) \
    |                        \
    ((c) << 16 & 0x0000ff00) \
    |                        \
    ((d) << 16 & 0x000000ff)
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...);
}