我想知道如何告诉编译器#define
是unsigned char
。
如果#define
1个字节执行此操作:
#define AACEESS_PSS 0x80
#define ACCESS_PSS ((unsigned char)0x80)
但如果#define
有更多的字节应该做什么?
例如:
#define ACCESS_PSS {0x32,0xFD,0x6E,0x2D}
我需要通过#define
unsigned char
int main(){
unsigned char ResponseData[100];
for (int i = 0; i <4;i++0){
if (ResponseData[i+5]==ACCESS_PSS){ //how to do this???
cout<<5<<endl;
}
来自programm的 ResponseData
获取值,而字节5到8等于ACCESS_PSS
。
答案 0 :(得分:3)
ResponseData第[i + 5] == ACCESS_PSS
您不能将四个unsigned chars
与C中的单个相等运算符进行比较。
您可以转换为uint32_t,但由于未对齐的访问或不同的字节顺序,它可能会中断,即:
#define ACCESS_PSS 0x32FD6E2D
...
if(*((uint32_t*) (ResponseData + i + 5)) == ACCESS_PSS) { /*...*/ }
唯一的干净方式是memcmp
或类似功能:
const unsigned char access_pss[4] = {0x32,0xFD,0x6E,0x2D};
...
if(memcmp(ResponseData + i + 5, access_pss, 4) == 0) { /*...*/ }
答案 1 :(得分:1)
从C99开始,我们就有了复合文字:
#define ACCESS_PSS (unsigned char const[]){0x32,0xFD,0x6E,0x2D}
您仍然可以将其用作ACCESS_PSS[2]
,例如
定义中的const
允许编译器进行优化,特别是它可以避免遍布该数组的多个副本。