C 结构体初始化

2019-07-21 07:14发布

因通信协议不确定,可能更改。现在程序中要取出命令字进行判断,不想在代码中充满USARTx_RX_BUF[5],想要代码便于更改和维护,
所以想到结构体。在com1.h中声明结构体
typedef struct {
        u8 u1c1;
        u8 u2c1;
        u8 u3c1;
        u8 u4c1;
        u8 u1c2;
        u8 u2c2;
        u8 u3c2;
        u8 u4c2;
}recvdef;

在com1.c中定义结构体
recvdef recvC=
{
        USART1_RX_BUF[5], //第一个命令字
        USART2_RX_BUF[5],
        USART3_RX_BUF[5],
        USART4_RX_BUF[5],
        USART1_RX_BUF[6], //第二个命令字
        USART2_RX_BUF[6],
        USART3_RX_BUF[6],
        USART4_RX_BUF[6]
};

USARTx_RX_BUF[5]是串口收到的数据位置,是第一个命令字
USARTx_RX_BUF[6]是串口收到的数据位置,是第二个命令字

USARTx_RX_BUF[5]和USARTx_RX_BUF[6]是在uart.c中定义的变量,在uart.h中声明
com1.c文件已包含uart.h头文件,
因为结构体成员初始化不能是变量;所以报错expression must have a constant value
除了#define,还有什么办法能解决这个问题?


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
42条回答
一起哈皮
1楼-- · 2019-07-22 18:58
 精彩回答 2  元偷偷看……
edmund1234
2楼-- · 2019-07-22 20:45
一起哈皮 发表于 2018-11-29 10:04
这不就是我9楼说的吗,就算你把那个(recvdef)去掉也没问题的,编译器先编译全局变量,函数内初始化就能定 ...

你去掉(recvdef)没问题? 呵呵
edmund1234
3楼-- · 2019-07-23 01:48
。。。。。。。。。。。。。去掉了是这个结果
一起哈皮
4楼-- · 2019-07-23 03:16
本帖最后由 一起哈皮 于 2018-11-29 10:14 编辑
edmund1234 发表于 2018-11-29 10:08
。。。。。。。。。。。。。去掉了是这个结果

汗,我们讨论的是变量初始化的时候的赋值,眼瞎才发现你是初始化完毕后的赋值,我从没看过这种加括号的写法比较好奇原理
xianshasaman
5楼-- · 2019-07-23 05:32
本帖最后由 xianshasaman 于 2018-11-29 10:19 编辑

这个和结构体没有关系,c语言里面所有变量都是这样。
一个静态变量或者全局变量初始化时的右值必须是一个在编译期能确定的常数,不能是内存里的变量。
比如
u8 test0 = 0;
u8 test1 = test0;
这样的基本类型的初始化一样会报错,并不是结构体引起的。

有一个例外是可以用只读型变量去初始化(虽然只读型变量并不是常数,但是只读型变量自己定义的时候一定会初始化成一个常数)
比如
const u8 test0 = 0;
u8 test1 = test0;
这么写就不报错。

这个问题你也可以自己测试一下,在keil5里也是这样,不要受吹牛的网友误导。
edmund1234
6楼-- · 2019-07-23 07:55
 精彩回答 2  元偷偷看……

一周热门 更多>