微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

是否可以在 c 中重新声明一个常量?

如何解决是否可以在 c 中重新声明一个常量?

我遇到过一段代码,其中在 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 语句之外使用,因此它在使用它的最小范围内声明。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。