问题描述
我遇到过一段代码,其中在 for 循环中多次重新声明了相同的 const 变量,如下所示:
#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
typedef struct {
int integer;
bool boolean;
} mystruct_t;
void main (void) {
int i;
uint8_t *buf;
for (i = 0; i < 5; ++i) {
const mystruct_t mystruct = {
.integer = i,.boolean = 0
};
memcpy(buf,&mystruct,sizeof(mystruct));
}
return;
}
根据 c 标准是否允许这样做(我使用的是 c99)?如果是这样,在每次迭代中重新声明 struct 背后的动机是什么?
解决方法
对于初学者,您不能使用关键字 struct
作为变量名。
const mystruct_t struct = {
^^^^^^
for 循环有自己的块作用域。当一个块作用域像这个代码片段一样递归地获得控制
for (i = 0; i < 5; ++i) {
const mystruct_t struct = {
.integer = i;
.boolean = 0;
};
memcpy(buf,&struct,sizeof(struct));
}
然后重新创建 mystruct_t
类型的常量变量。
来自 C 标准(6.2.4 对象的存储持续时间)
6 对于这样一个没有变长数组的对象 类型,它的生命周期从进入它所在的块开始 关联直到该块的执行以任何方式结束。(输入 封闭的块或调用函数会挂起,但不会结束, 执行当前块。) 如果进入了块 递归地,每次都会创建对象的一个新实例。这 对象的初始值是不确定的。如果初始化是 为对象指定,每次声明或 在块的执行中达到复合文字; 否则,每次声明时,该值都会变得不确定 已到达。
因此,您的代码片段中没有重新声明这两个变量。在 for 循环的每次迭代中,都会创建一个具有相同名称的变量的新实例。该变量用限定符 const
声明,因为它没有在 for 语句的块范围内更改。由于变量不在 for 语句之外使用,因此它在使用它的最小范围内声明。