【问题标题】:why cannot static structure pointer be initialized to address of a variable为什么不能将静态结构指针初始化为变量的地址
【发布时间】:2018-05-05 09:32:25
【问题描述】:

当我以下面的形式初始化结构时出现错误

static struct A* a = &apple->queue[queue_number];
static struct B* b = &banana->queue_a[queue_number];

我遇到错误

Error:  #28: expression must have a constant value

我想将指针 a 和 b 保持为静态,以便它的范围保持在同一个文件中。 请在这里帮忙

【问题讨论】:

  • 让我猜猜:变量ab 是全局变量吗?那些需要初始化为编译时常量,你不能为此使用运行时变量。请创建一个Minimal, Complete, and Verifiable Example,这样我们就不必猜测了。
  • 它必须是一个常数值。这意味着编译时间常数。如果没有看到更多代码,就不可能建议您可以做什么。
  • &apple->queue[queue_number] 在编译时是否已知?只有这样它才能用于初始化静态和/或全局变量。
  • @alk,在 C 语言中,AFAIR 至少需要 queue_number 成为 #define - 静态 const 不会在这里做...
  • @FelixPalmen:很公平......“在编译时知道”这个词也是模棱两可的。 :-/

标签: c pointers static


【解决方案1】:

这是因为astatic 类型,它应该使用constants 或变量值(在您的情况下为&apple->queue[queue_number])在编译时而不是在运行时进行初始化时间。 来自 C 标准

具有静态的对象的初始化程序中的所有表达式 或线程存储持续时间应为常量表达式或字符串 文字。

我想将指针 a 和 b 保持为静态? 一种方法是先用 a 初始化 a 并对其进行测试。

static struct A *a = NULL;
if(a == NULL) { /* point to remember when a become NULL it initialize again a */
        a = &apple->queue[queue_number]; /*initialize expected value here */ 
}

也许你想读这个Error "initializer element is not constant" when trying to initialize variable with const

【讨论】:

  • 您可能想要更详细地解释在 this 上下文中“常量”的含义,因为不幸的是,它在 C 标准中的使用有些模棱两可。
  • 不是单独的标志变量,而是初始化指向NULL的指针,并对其进行测试。
  • 是的@Barmar 这是一个好主意,而不是单独的标志变量
  • 如果它真的对你有帮助,请点击我的答案@sobincoder
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-19
  • 1970-01-01
  • 2017-03-12
  • 2017-09-19
  • 2016-11-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多