家伙,我有从8位 1抽取32位可变码接下来的两件)首先是:操作可能未定义的宏
#include <stdio.h>
#include <string.h>
int main()
{
unsigned char buffer[] = {0xaa, 0xbb, 0xcc, 0xdd, 0xee};
unsigned char *buff = buffer;
unsigned int result;
result = *buff++;
result += *buff++ <<8;
result += *buff++ << 16;
result += *buff++ <<24;
printf("result = 0x%x, *buffer = 0x%x.", result, *buff);
return 0;
}
没有任何警告,但它看起来有点跛....
2)在第二,我们有宏观的,而不是那些丑陋的4条线路:
#include <stdio.h>
#include <string.h>
#define to32(buffer) ((unsigned int)*buffer++ | *buffer++ << 8 | *buffer++ << 16 | *buffer++ << 24)
int main()
{
unsigned char buffer[] = {0xaa, 0xbb, 0xcc, 0xdd, 0xee};
unsigned char *buff = buffer;
unsigned int result = to32(buff);
printf("result = 0x%x, *buffer = 0x%x.", result, *buff);
return 0;
}
而且它的叶子下一个警告:
main.cpp: In function 'int main()':
main.cpp:4:99: warning: operation on 'buff' may be undefined [-Wsequence-point]
#define to32(buffer) ((unsigned int)*buffer++ | *buffer++ << 8 | *buffer++ << 16 | *buffer++ << 24)
我有点困惑GCC发现什么是未定义的行为。 是不是所有的移动都在一行中,我总结它?
我将调查此问题。基本上我很困惑,因为代码的两个部分几乎是相同的,但由于某种原因当你把它写成这个宏时,它会被编译为警告 – Douman