【问题标题】:How to assign returned function value to a const global variable [duplicate]如何将返回的函数值分配给 const 全局变量 [重复]
【发布时间】:2018-04-20 12:45:29
【问题描述】:

我正在尝试用全局编译一个库(我需要它),但我需要使用返回的函数指针初始化这个全局常量。 但是如果有人可以有解决方案,GCC 不想为我的全局分配一个变量值。

error: initializer element is not constant
t_page_meta_data *const begin_meta_data = (t_page_meta_data *const)alloc_page(1);

谢谢。

【问题讨论】:

  • 您想将变量值分配给“常量全局变量”?
  • 是的,我想用我的函数返回的值初始化全局。
  • 恐怕你不能在 C 中做到这一点,但你可以在 C++ 中。
  • 假设函数包含某种可以在编译时执行的静态计算,C中的正常过程是使用宏。

标签: c linux


【解决方案1】:

据我所知,您不能在 C 中使用 const 全局变量执行此操作。但是,如果您仍想公开一些只读全局,则可以执行以下操作:

static t_page_meta_data *real_begin_meta_data;
t_page_meta_data *const *const begin_meta_data = &real_begin_meta_data;

int main()
{
    real_begin_meta_data = (t_page_meta_data*)alloc_page(1);
    // begin_meta_data = NULL  <= error
    // *begin_meta_data = NULL <= error
}

begin_meta_data 将作为指向static 变量real_begin_meta_data 的全局变量公开。对于全局用户来说,这是一个额外的间接级别,但它确实有效。请注意,**begin_meta_data 是非常量 - 这相当于 *begin_meta_data 在您问题的代码中是非常量。

另一种方法是只使用函数而不是全局变量:

static t_page_meta_data *real_begin_meta_data;
t_page_meta_data *begin_meta_data()
{
    return real_begin_meta_data;
}

int main()
{
    real_begin_meta_data = (t_page_meta_data*)alloc_page(1);
}

现在用户只需使用begin_meta_data() 来获取指针。显然他们无法更改它所指向的内容,因为他们看不到real_begin_meta_data。但他们仍然可以修改*begin_meta_data(),就像在您的代码中一样。

【讨论】:

  • 这只会使指针变为 const。仍然可以访问指向的数据,这与将real_value 作为全局变量一样糟糕。我假设您打算使用const int* const。
  • 我起初是这样做的,但后来我看到 OP 有一个指向非 const 的 const 指针。所以我认为这更符合 OP 的需求。我将编辑以使 real_value 本身成为一个指针以更好地匹配 OP。
  • 这可能意味着 OP:s 代码没有任何意义,最重要的是。
  • 或者 OP 希望 begin_meta_data 始终指向同一事物,但它指向的数据是可修改的。
  • 谢谢你们的帮助,我会努力的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-16
  • 1970-01-01
  • 1970-01-01
  • 2021-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多