结构体初始化 initializer element is not constant

今天,同事为了让代码数据正确显示到界面上,要求我通过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()函数实现主机字节序转换成网络字节序(大端字节序);

总结:

  1. 全局变量是保存在静态存储区,只能用常量进行初始化
  2. 局部变量,初始化可常量,变量赋值
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 官方文档 初始化 Initialization是为准备使用类,结构体或者枚举实例的一个过程。这个过程涉及了在实例里...
    hrscy阅读 1,148评论 0 1
  • 1.流程 创建 HelloWorld.java代码如下package jvm; /** * @author ...
    RunAlgorithm阅读 1,369评论 4 6
  • 不到20个小时的时间, 你便与我挥手告别。 我不愿与你分别, 但你还是慢慢松开我的手 缓缓离去 回想与你走过的时光...
    YolandaYanyoyo阅读 238评论 0 1
  • 昨天,父亲在朋友圈里发了家里紫阳花开的照片。我看到那张照片,却有一种要泪流满面的感觉。 离开故乡独自生活在城市,一...
    冉染阅读 412评论 0 0
  • 这星期去学校的星期二,我们将会迎来万圣节。 万圣节是每年的公历10月31日,农历9月12。...
    曾经我们都很好阅读 249评论 0 0