今天,同事为了让代码数据正确显示到界面上,要求我通过udp服务器发送参数设置给界面,我的主机是小端模式,对方是大端接收。本来想模拟一组数据发送过去试一试。结果发现得给他 转换字节序,于是发现了如下全局变量赋值的问题。由于是测试数据,最后就用不大于F的数进行模拟了。记录如下:
结构体初始化 initializer element is not constant
1. 例子
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
typedef struct
{
unsigned int ulRecvPara;
unsigned int ulSendPara;
unsigned char ucSwitch;
}SETSYSPARA_ST;
SETSYSPARA_ST stParrRight ={
.ulRecvPara = 0x10,
.ulSendPara = 0x20,
.ucSwitch = 0x1,
};
/*结构体初始化错误典型如下
SETSYSPARA_ST stParaError = {
.ulRecvPara = htonl(0x10),
.ulSendPara = htonl(0x20),
.ucSwitch = 0x1,
};
*/
int main(int argc, char**argv)
{
return 0;
}
2.分析
全局变量是保存在静态存储区的,因此在编译的时候只能用常量进行初始化,而不能用变量进行初始化。全局变量的内存地址直接存储变量的值。在该程序中是用函数htonl的返回值给结构体成员进行初始化的,因此会出错.initializer element is not constant
。
htonl()函数实现主机字节序转换成网络字节序(大端字节序);
总结:
- 全局变量是保存在静态存储区,只能用常量进行初始化
- 局部变量,初始化可常量,变量赋值
网友评论