请问这两种方式有什么不同,为什么main里面的会报错呢?
请问这两种方式有什么不同,为什么main里面的会报错呢?
请问这两种方式有什么不同,为什么main里面的会报错呢?
引自免费微信小程序:皆我百晓生
从你提供的代码片段来看,你遇到了C语言中关于const
修饰符以及结构体赋值的问题。下面将详细解释两段代码的区别,并分析为何在main
函数中的赋值方式会导致编译错误。
static ble_gap_scan_params_t const m_scan_params = {
.active = 1, // 主动扫描
.interval = 0x00A0, // 扫描间隔
.window = 0x0050, // 扫描窗口
.timeout = 0x0000, // 扫描超时
.scan_phys = 0x01, // 扫描物理位域
.filter_policy = 0x00 // 过滤策略
};
在这段代码中,m_scan_params
被声明为const
,意味着一旦初始化后其成员就不能再修改。初始化时,结构体成员通过初始化列表直接赋值,这是正确的初始化方法。
ble_gap_scan_params_t const ble_gap_sp;
ble_gap_sp.active = 1;
ble_gap_sp.interval = 0x00a0;
ble_gap_sp.window = 0x0050;
ble_gap_sp.timeout = 0x0000;
ble_gap_sp.scan_phys = 0x01;
ble_gap_sp.filter_policy = 0x00;
在main
函数中,你尝试对const
类型的结构体变量ble_gap_sp
的成员进行赋值。这违反了C语言中const
变量不可修改的规定,因此编译器会报错。这是因为当一个变量被声明为const
时,它在初始化之后就不能再被修改,任何试图修改它的操作都会导致编译错误。
如果你想要在运行时动态设置结构体成员的值,那么就不应该使用const
修饰符。如果const
是必要的,例如为了确保某些配置参数在程序运行过程中不会被意外更改,那么你应该在声明时立即初始化这些参数,就像第一段代码中那样。
ble_gap_scan_params_t ble_gap_sp; // 去掉const修饰符
ble_gap_sp.active = 1;
ble_gap_sp.interval = 0x00a0;
ble_gap_sp.window = 0x0050;
ble_gap_sp.timeout = 0x0000;
ble_gap_sp.scan_phys = 0x01;
ble_gap_sp.filter_policy = 0x00;
这样修改后,ble_gap_sp
就可以在运行时被修改了。如果你确实需要使用const
,请确保所有成员都在声明时初始化,以避免编译错误。