【问题标题】:Initializing const variables in C在 C 中初始化 const 变量
【发布时间】:2018-10-13 17:26:34
【问题描述】:

我想构建两个库 lib1.alib2.a

lib2.a 处于顶层,它只能与lib1.a 全局数据共享,不能与头文件共享。然后 lib1.a 可以通过 extern 关键字使用这些数据。

我发现的困难是:我想用 lib2.a 中定义的数据在 lib1.a 内的 file1.c 中初始化一个常量

例子:

//lib1.a->file1.c:
const My_Var_Type My_Var = {
    .field1 = data1,
    .field2 = data2,
    .field3 = data3,
    .field4 = data4
};

现在data1data4 应该从lib2.a 获得,我将它们声明为常量但没有办法!编译器产生这个错误:

   initializer element is not constant

有没有办法解决这个错误?

【问题讨论】:

  • 请创建一个minimal reproducible example,包括您的makefile或其他有关您如何构建的完整信息。
  • 一个简单的解决方案是使用C++编译并将data1等声明为extern "C"。 C++ 中const 的语义与 C 中的不同,因此这段代码是合法的。我会把它作为一个答案发布,除了语言警察会否决它,因为它建议 C++ 作为 C 问题的解决方案。他们可能是对的,但也许 C++ 是你所需要的。
  • @Clifford 有趣的建议。为了不打扰编译并且非常放松,我推荐 PHP 或 JavaScript。
  • 不是用 data 初始化 const,而是用 constant 初始化 const。有关详细信息,最好查看定义/声明的代码,data1 等。
  • @P__J__ C++ 的建议是由于它与 C 的简单互操作性,因为库 lib1.a 和 lib2.a 具有 C 链接接口。在其他语言中使用这些库可能并不那么简单。

标签: c initialization


【解决方案1】:

您不能使用非常量表达式初始化静态存储对象(全局对象或具有属性static) - 例如,另一个变量。这些对象是const还是不是都没有关系

这是非法的:

extern int data1, data2, data3, data4;

typedef struct
{
    int field1;
    int field2;
    int field3;
    int field4;
}My_Var_Type;

  const My_Var_Type My_Var=
     {
      .field1 = data1,   /* wrong */
      .field2 = data2,   /* wrong */
      .field3 = data3,   /* wrong */
      .field4 = data4,   /* wrong */
     };


int main()
{
    /* .... */
    return 0;
}

您可以通过这种方式初始化自动变量。

int main()
{
  const My_Var_Type My_Var=
     {
      .field1 = data1,   /* good */  
      .field2 = data2,   /* good */
      .field3 = data3,   /* good */
      .field4 = data4,   /* good */
     };

    /* ....*/

    return 0;
}

【讨论】:

  • 所以这是不可能的。你还有什么建议吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-08
  • 2015-09-09
相关资源
最近更新 更多