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